我想知道以下两个表达式之间有什么区别?
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
})发布于 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 --众所周知,信用卡在没有客户的情况下是永远不存在的,因此,它可以对其客户进行无所有权的引用,而不会在信用卡仍在使用时被毁。
除了更容易使用(不需要打开包装)之外,未拥有的引用具有较低的总体开销,因此有一定的风险/回报。即使弱引用对对象的引用计数没有贡献,但它们仍然需要某种级别的跟踪,没有所有权的引用更少。
https://stackoverflow.com/questions/29624495
复制相似问题