14 cocoa objective-c automatic-ref-counting
Apple最近发布了Transitioning to ARC Release Notes,这是一份解释ARC的文档,解决了将非ARC代码转换为ARC的一些问题.在这些说明中,他们提到了以下内容:
如果您[原文如此]发现必须实现自定义保留或释放方法,那么您还必须在类中实现以下方法:
Run Code Online (Sandbox Code Playgroud)-(BOOL)supportsWeakPointers { return NO; }此方法将防止弱对象形成到您的对象.强烈建议您找到一种不需要实现自己的保留和释放方法而不是这样做的解决方案.
考虑这种情况:
声明一个名为MyClass的类,并将-supportsWeakPointers实现为返回NO.告诉Xcode使用-fno-objc-arc编译相应的实现文件.为了更好地衡量,请将类声明为NS_AUTOMATED_REFCOUNT_WEAK_UNAVAILABLE并覆盖-release和-retain.
在MainMenu.xib中,放置一个MyClass类型的顶级对象.
在应用程序委托中,为MyClass的实例指定弱IBOutlet属性:
@property (weak) IBOutlet MyClass *myObject;
Run Code Online (Sandbox Code Playgroud)
并将其连接到nib文件中的相应对象.在这种情况下,由于对象是顶级nib对象而File的Owner属于NSApplication类型,因此该对象是使用额外的引用计数创建的,这意味着它应该保持活动直到显式释放.使用ARC,这意味着调用CFRelease(),因为ARC禁止发送释放消息.
我的问题是双重的三倍:
为什么是-supportsWeakPointers实例方法而不是类方法?是否存在类允许弱引用的实例不同的情况?
-supportsWeakPointers永远不会发送到加载nib文件时创建的MyClass实例; 为什么?我已经通过在其中放置NSLog()并向Xcode添加符号断点来测试它.而且,我从来没有得到过
cannot form weak reference to instance (0x???) of class MyClass
Run Code Online (Sandbox Code Playgroud)
我运行程序时的消息.
在程序执行期间,MyClass类型的顶级nib对象永远不会被释放,因为我的程序永远不会释放它.但是,在加载nib文件后,相应的弱插座为nil; 为什么?将outlet属性更改为strong会导致对象与nil不同,但这不是必需的.真的不会发生; 抱歉.我正在测试一个版本,该版本正在分配一个尚未真正使用的新对象,因此ARC正确分配nil给该属性.
我在Mac OS X v10.7.2盒子上使用Xcode 4.2和Apple LLVM Compiler 3.0.
考虑具有"共享"或"默认"实例以及其他实例(例如NSFileManager)的类的情况.您的共享实例可能与其他可分配实例具有不同的弱指针行为.有时,不同的实例可能需要不同的弱指针行为.有人说过,如果是这种情况,那可能是不对的.
(答案1. 最初由Chris Parker撰写.我将其添加到Joshua的答案中,以便接受的答案完成.)
在您的样本中supportsWeakPointers,allowsWeakReference按照定义更改为NSObject.h导致事物的行为与预期的一样.它被标记为NS_DEPRECATED但是它看起来还没有SDK中的替代品.
| 归档时间: |
|
| 查看次数: |
1102 次 |
| 最近记录: |