首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在斯威夫特,自我和无我有什么区别?

在斯威夫特,自我和无我有什么区别?
EN

Stack Overflow用户
提问于 2015-04-14 10:03:32
回答 1查看 919关注 0票数 2

我想知道以下两个表达式之间有什么区别?

代码语言:javascript
复制
foregroundNotification = NSNotificationCenter.defaultCenter().addObserverForName(UIApplicationWillEnterForegroundNotification, object: nil, queue: NSOperationQueue.mainQueue(), usingBlock: { 
  (notification:NSNotification!) -> Void in
   // do something
})

和(使用unowned self):

代码语言:javascript
复制
foregroundNotification = NSNotificationCenter.defaultCenter().addObserverForName(UIApplicationWillEnterForegroundNotification, object: nil, queue: NSOperationQueue.mainQueue(), usingBlock: { 
  [unowned self] (notification:NSNotification!) -> Void in
   // do something
})
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-14 11:19:36

快速内存管理通过引用计数来执行。您可以在official Swift docs中阅读有关引用计数及其含义的很好的摘要。

但是,总而言之--引用计数内存管理的问题是引用周期的风险--对象A保持对对象B的引用,对象B保持对对象A的引用,即使不再使用对象A或对象B时,它们仍然保持彼此的活力,从而阻止内存被释放、它们的deinit方法被调用等等。

Swift中的引用循环有两种解决方案-弱引用和非拥有引用.

弱引用不计入对象的引用计数。因此,如果对象B只有对对象A的弱引用,那么当删除所有其他强引用时,对象A就被销毁。显然,对象B可能会尝试使用对象A。这就是在Swift中弱引用是选项的原因--您必须打开它们(返回强引用而不是弱引用),以检查引用对象是否仍然存在。

非拥有的引用相似,因为它们不会导致对象被保留。但是,与弱引用不同,它们不是选项,不需要首先检查。相反,从文档:

如果尝试在释放引用的实例之后访问未拥有的引用,则将触发运行时错误。仅当您确信引用将始终引用实例时,才使用未拥有的引用。 还请注意,Swift保证您的应用程序将崩溃,如果您试图访问一个未拥有的引用后,它的引用被取消分配。在这种情况下,您永远不会遇到意外的行为。你的应用总是可靠的崩溃,虽然你应该,当然,防止它这样做。

这意味着,您只应该在以下情况下使用它们:根据程序的逻辑,在持有未拥有引用的对象之前,不可能销毁未拥有的对象。Swift文档中的示例是一个Customer和一个CreditCard --众所周知,信用卡在没有客户的情况下是永远不存在的,因此,它可以对其客户进行无所有权的引用,而不会在信用卡仍在使用时被毁。

除了更容易使用(不需要打开包装)之外,未拥有的引用具有较低的总体开销,因此有一定的风险/回报。即使弱引用对对象的引用计数没有贡献,但它们仍然需要某种级别的跟踪,没有所有权的引用更少。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29624495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档