斯威夫特的自我和无主的自我有什么区别



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

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

和(与unowned self):

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

Swift内存管理是通过引用计数来执行的。你可以在Swift官方文档中阅读一篇关于引用计数及其含义的总结。

然而,总的来说,引用计数内存管理的问题是引用循环的风险——对象A持有对对象B的引用,对象B持有对对象A的引用。即使没有人再使用对象A或对象B,它们也会保持彼此的活力,防止内存被释放,它们的deinit方法被调用等。

Swift中的引用循环有两种解决方案——弱引用和无主引用。

弱引用不计入对象的引用计数。因此,如果对象B只有对对象a的弱引用,那么当所有其他强引用都被删除时,对象a就会被破坏。显然,风险在于对象B可能会尝试使用对象A。这就是为什么在Swift中,弱引用是可选的——你必须打开它们(返回强引用而不是弱引用)来检查被引用的对象是否仍然存在。

无主引用的相似之处在于,它们不会导致对象被保留。然而,与弱引用不同,它们不是可选的,不需要首先进行检查。相反,从文档:

如果您试图在引用的实例之后访问它引用被释放,则会触发运行时错误。使用只有当您确信引用将总是引用一个实例。

请注意,Swift保证,如果您尝试在引用的实例为之后访问无主引用解除分配。在这种情况下,你永远不会遇到意想不到的行为情况你的应用程序总是会可靠地崩溃,尽管你应该,当然,要阻止它这样做。

这意味着您应该只在根据程序逻辑知道在拥有无主引用的对象之前不可能销毁无主对象的情况下使用它们。Swift文档中的例子是CustomerCreditCard——众所周知,信用卡在没有客户的情况下永远不会存在,因此它可以拥有对其客户的无主引用,而不会在信用卡仍在使用时有客户被销毁的风险。

除了更容易使用(无需打开)之外,无主引用的总体开销更低,因此有一点风险/回报。即使弱引用对对象的引用计数没有贡献,但它们仍然需要一定程度的跟踪,而无主引用则不那么需要。

最新更新