gpt4 book ai didi

objective-c - -supportsWeakPointers的作用

转载 作者:太空狗 更新时间:2023-10-30 03:19:14 24 4
gpt4 key购买 nike

Apple 最近发布了 Transitioning to ARC Release Notes ,一份解释 ARC 并解决将非 ARC 代码转换为 ARC 的一些问题的文档。在这些注释的第一个版本中,他们提到了以下内容:

If you you [sic] find that you must implement custom retain or release methods, then you must also implement the following method in your class:

-(BOOL)supportsWeakPointers { return NO; }

This method will prevent weak pointers from being formed to your objects. You are strongly encouraged to find a solution that doesn’t require implementing your own retain and release methods instead of doing this.

考虑这个场景:

  1. 声明一个名为 MyClass 的类并实现 -supportsWeakPointers 以返回 NO。用-fno-objc-arc告诉Xcode编译对应的实现文件。为了更好地衡量,将类声明为 NS_AUTOMATED_REFCOUNT_WEAK_UNAVAILABLE 并覆盖 -release 和 -retain。

  2. 在 MainMenu.xib 中,放置一个 MyClass 类型的顶级对象。

  3. 在应用程序委托(delegate)中,为 MyClass 的实例指定弱 IBOutlet 属性:

     @property (weak) IBOutlet MyClass *myObject;

    并将其连接到nib文件中的相应对象。 在这种情况下,由于该对象是顶级nib对象并且File's Owner是NSApplication类型, that object is created with an extra reference count ,这意味着它应该保持事件状态,直到明确发布。对于 ARC,这意味着调用 CFRelease(),因为 ARC 禁止发送释放消息。

我的问题是双重的 三重 :

  1. 为什么 -supportsWeakPointers 是实例方法而不是类方法?在任何情况下,一个类可以具有在允许弱引用方面不同的实例吗?

  2. -supportsWeakPointers 永远不会发送到加载 nib 文件时创建的 MyClass 实例;为什么?我通过在其中放置一个 NSLog() 并向 Xcode 添加一个符号断点来测试它。另外,我从来没有得到过

     cannot form weak reference to instance (0x???) of class MyClass

    运行程序时的消息。

  3. MyClass 类型的顶级 nib 对象在程序执行期间不应该被释放,因为我的程序永远不会释放它。但是nib文件加载后对应的weak outlet为nil;为什么?将 outlet 属性更改为 strong 会导致对象与 nil 不同,但这不是必需的。 并没有真正发生;对不起。我正在测试一个版本,该版本正在分配一个未真正使用的新对象,因此 ARC 正确地将 nil 分配给该属性。

重现此错误的示例项目可用 here .

我在 Mac OS X v10.7.2 机器上使用 Xcode 4.2 和 Apple LLVM Compiler 3.0。

最佳答案

  1. 考虑具有“共享”或“默认”实例和其他实例(例如 NSFileManager)的类的情况。您的共享实例可能具有与其他可分配实例不同的弱指针行为。有时不同的实例可能需要不同的弱指针行为。话虽如此,如果是这种情况,则可能不太正确。

    (答案 1. 是 originally written by Chris Parker。我将其添加到 Joshua 的答案中,以便接受的答案是完整的。)

  2. 在您的示例中,根据 NSObject.h 中的定义,将 supportsWeakPointers 更改为 allowsWeakReference 会导致事情按预期运行。它被标记为 NS_DEPRECATED,但看起来 SDK 中还没有替代方案。

关于objective-c - -supportsWeakPointers的作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7788108/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com