Objective c “a”是什么;“非弱调零参考”;

Objective c “a”是什么;“非弱调零参考”;,objective-c,cocoa,memory-management,nsnotificationcenter,osx-elcapitan,Objective C,Cocoa,Memory Management,Nsnotificationcenter,Osx Elcapitan,在报告中,我发现以下情况: NSNotificationCenter和NSDistributedNotificationCenter不再向注册的观察者发送可能被解除分配的通知。如果观察者能够存储为调零弱参考,则底层存储将观察者存储为调零弱参考。或者,如果对象不能弱存储(因为它有一个自定义的保留/释放机制,这将阻止运行时弱存储对象)则对象将存储为非弱归零引用。这意味着观察者不需要在其释放方法中取消注册。[我的重点] 这对我来说毫无意义。如果它是一个非弱引用,那么它不是一个强引用吗?因此NSNoti

在报告中,我发现以下情况:

NSNotificationCenter和NSDistributedNotificationCenter不再向注册的观察者发送可能被解除分配的通知。如果观察者能够存储为调零弱参考,则底层存储将观察者存储为调零弱参考。或者,如果对象不能弱存储(因为它有一个自定义的保留/释放机制,这将阻止运行时弱存储对象)则对象将存储为非弱归零引用。这意味着观察者不需要在其释放方法中取消注册。[我的重点]

这对我来说毫无意义。如果它是一个非弱引用,那么它不是一个强引用吗?因此NSNotificationCenter仍然是所有者,因此对象不会解除分配(直到手动取消注册),因此在这种情况下说它是“归零”是毫无意义的


如果这指的是一种
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。为了解释,让我们看一下
objc_弱.mm

id 
weak_read_no_lock(weak_table_t *weak_table, id *referrer_id) 
{
    ...

    if (! referent->ISA()->hasCustomRR()) {
        if (! referent->rootTryRetain()) {
            return nil;
        }
    }
    else {
        BOOL (*tryRetain)(objc_object *, SEL) = (BOOL(*)(objc_object *, SEL))
            object_getMethodImplementation((id)referent, 
                                           SEL_retainWeakReference);
        if ((IMP)tryRetain == _objc_msgForward) {
            return nil;
        }
        if (! (*tryRetain)(referent, SEL_retainWeakReference)) {
            return nil;
        }
    }

    return (id)referent;
}
如您所见,当对象使用自定义的
-retain
-release
方法时,不能保证它们支持弱引用(还请注意,对于对象的弱引用,您可以使用完全不同的对象,尽管这是另一个时间的主题)

这是因为弱引用被
objc\u destructionInstance
清除,它调用
objc\u cleardeallocation
,调用
弱\u clear\u no\u lock

现在,定制对象实现不需要调用
objc_destructionInstance,尽管大多数对象都会调用它

因此,运行时允许您实现方法
-allowsWeakReference
(和
retainWeakReference
)来禁用对对象的弱引用,在这种情况下,很可能通过在对象上滑动
-dealloc
将其置零。当然,这些都是实现细节,所以NSNotificationCenter可以有自己的创新方式,但这是我最好的猜测,不需要尝试分解NSNotificationCenter

将属性声明为强将使该属性成为强引用。 将其声明为弱引用将使用零化弱引用。这个 不安全\u未恢复修饰符使用非归零弱引用

简而言之:
非弱调零参考
=
不安全\u未恢复参考

参考:


关于我所指的swizzling的一个示例实现,请看一看。有很多详尽的答案,也正是我希望得到的解释。谢谢这个问题与更常见的情况不同。不是“什么是非零弱引用”。这里的问题是“什么是非弱调零参考”。你的意思是它们是不同的?