Objective c 在Swift中,自我和无主自我有什么区别?

Objective c 在Swift中,自我和无主自我有什么区别?,objective-c,iphone,swift,Objective C,Iphone,Swift,我想知道下面两个表达之间有什么区别 foregroundNotification = NSNotificationCenter.defaultCenter().addObserverForName(UIApplicationWillEnterForegroundNotification, object: nil, queue: NSOperationQueue.mainQueue(), usingBlock: { (notification:NSNotification!) -> V

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

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


通过引用计数执行快速内存管理。您可以在中阅读参考计数及其含义的良好摘要

但是,总而言之,引用计数内存管理的问题在于引用周期的风险——对象A持有对对象B的引用,对象B持有对对象A的引用。即使没有人再使用对象A或对象B,它们也会保持彼此的活动状态,从而防止内存被释放,他们的去离子方法被调用等等

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

弱引用不计入对象的引用计数。所以,如果对象B对对象a只有弱引用,那么当所有其他强引用被删除时,对象a被销毁。显然,风险在于对象B可能会尝试使用对象A。这就是为什么在Swift中弱引用是可选的–您必须将它们展开,以返回强引用而不是弱引用,以检查引用的对象是否仍然存在

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

如果您尝试在创建引用的实例之后访问无主引用 如果取消分配引用,将触发运行时错误。使用 无主引用仅当您确信引用将 总是引用一个实例

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

这意味着您应该仅在以下情况下使用它们:根据程序的逻辑,您知道在持有无主引用的对象之前,无主对象不可能被销毁。Swift文档中的示例是客户和信用卡–众所周知,信用卡在没有客户的情况下是不存在的,因此它可以对其客户进行无主引用,而不会在信用卡仍在使用时导致该客户被销毁


除了更易于使用,无需展开之外,无主引用的总体开销更低,因此有一点风险/回报回报。尽管弱引用不会影响对象的引用计数,但它们仍然需要某种程度的跟踪,无主引用则更少。

通过引用计数执行快速内存管理。您可以在中阅读参考计数及其含义的良好摘要

但是,总而言之,引用计数内存管理的问题在于引用周期的风险——对象A持有对对象B的引用,对象B持有对对象A的引用。即使没有人再使用对象A或对象B,它们也会保持彼此的活动状态,从而防止内存被释放,他们的去离子方法被调用等等

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

弱引用不计入对象的引用计数。所以,如果对象B对对象a只有弱引用,那么当所有其他强引用被删除时,对象a被销毁。显然,风险在于对象B可能会尝试使用对象A。这就是为什么在Swift中弱引用是可选的–您必须将它们展开,以返回强引用而不是弱引用,以检查引用的对象是否仍然存在

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

如果您尝试在创建引用的实例之后访问无主引用 如果取消分配引用,将触发运行时错误。使用 无主引用仅当您确信引用将 总是引用一个实例

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

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


除了更易于使用,无需展开之外,无主引用的总体开销更低,因此有一点风险/回报回报。尽管弱引用不会影响对象的引用计数,但它们仍然需要某种程度的跟踪,无主引用的情况则更少。

您应该阅读Swift编程语言中的“解析闭包的强引用循环”一章。它解释了这是做什么的,以及为什么要这样做。无主意味着这只是对自我的弱引用,所以你阻止它不会创建一个强保留循环。@holex不,弱意味着它是对自我的弱引用。无主意味着它是对自我的无主引用。它们不一样,尽管它们都用于避免保留循环。@AirspeedVelocity,实际上您完全正确,它在技术上不是弱引用。@AirspeedVelocity弱引用和无主引用之间有什么区别?您应该阅读Swift编程语言中解析闭包的强引用循环一章。它解释了这是做什么的,以及为什么要这样做。无主意味着这只是对自我的弱引用,所以你阻止它不会创建一个强保留循环。@holex不,弱意味着它是对自我的弱引用。无主意味着它是对自我的无主引用。它们不一样,尽管它们都是用来避免保留循环的。@AirspeedVelocity,实际上你完全正确,从技术上讲,它不是一个弱参考。@AirspeedVelocity弱参考和无参考有什么区别?回答得很好。因此,使用[弱自我]而不是[无主自我]可能更好?弱自我总是更安全的选择。无主是一种性能优化/便利,当您确定您的程序的结构不可能无效时。把它想象成数组下标——当你访问myArray[5]时,你需要确保有这样一个元素,有时你的代码总是以这样一种方式编写的,但如果没有,你的应用程序可能会崩溃。答案很好。因此,使用[弱自我]而不是[无主自我]可能更好?弱自我总是更安全的选择。无主是一种性能优化/便利,当您确定您的程序的结构不可能无效时。把它想象成数组下标——当您访问myArray[5]时,您需要确保有这样一个元素,有时您的代码编写方式总是会有,但如果没有,您的应用程序可能会崩溃。
foregroundNotification = NSNotificationCenter.defaultCenter().addObserverForName(UIApplicationWillEnterForegroundNotification, object: nil, queue: NSOperationQueue.mainQueue(), usingBlock: { 
  [unowned self] (notification:NSNotification!) -> Void in
   // do something
})