我怎么知道对象是否可以被弱引用?

时间:2016-12-28 03:07:48

标签: ios swift nsnotificationcenter

Foundation Release Notes for OS X v10.11 and iOS 9: NSNotificationCenter说:"如果一个对象被弱引用,则在重新分配期间将不再向观察者发送通知。"如何判断对象是否可以被弱引用"?

2 个答案:

答案 0 :(得分:4)

Clang documentation中有一些相关信息:

  

明确允许Objective-C类不支持   __弱引用。使用指向Objective-C对象的指针执行具有弱赋值语义的操作是未定义的行为   其类不支持__weak引用。

     

原理

     

从历史上看,一个班级有可能提供自己的班级   覆盖保留,释放等的引用计数实现   但是,对对象的弱引用需要与其协调   class的引用计数实现,因为,除其他外,   弱负荷和储存必须是最终的原子   发布。因此,现有的自定义引用计数实现   如果没有额外的努力,通常不会支持弱引用。   在不破坏二进制兼容性的情况下,这是不可避免的。

     

类可能表示它不支持弱引用   提供objc_arc_weak_reference_unavailable属性   class的接口声明。可保留的对象指针类型是   weak-unavailable if指向(可选的协议限定)指针   Objective-C class T其中T或其中一个超类具有   objc_arc_weak_reference_unavailable属性。一个程序是不正确的   如果它将__weak所有权限定符应用于弱不可用   类型或弱赋值操作的值操作数是否为   弱不可用类型。

此外,假设它仍然是最新的,Transitioning to ARC说:

  

哪些类不支持弱引用?

     

您当前无法创建对实例的弱引用   以下课程:

     

NSATSTypesetter,NSColorSpace,NSFont,NSMenuView,NSParagraphStyle,   NSSimpleHorizo​​ntalTypesetter和NSTextView。

答案 1 :(得分:2)

基本上,您了解的每个对象都可以被弱引用。文档中的前一句描述了规则的例外:"即。它有一个自定义的保留/释放机制,可以防止运行时能够弱地存储对象"。您可能不希望注册的对象符合该描述。