使用ARC并定位iOS 4.0时,如何替换弱引用?


87

我已经开始使用Xcode 4.2开发我的第一个iOS应用程序,并以“实用程序”模板(FlipsideViewController附带的模板)为目标iOS 5.0。

我读到,由于ARC是编译时功能,因此它也应与iOS 4兼容,因此我尝试将我的应用程序定位为4.3,然后尝试对其进行编译。当我这样做时,会出现以下错误:

FlipsideViewController.m:错误:自动引用计数问题:当前部署目标不支持自动__weak引用

它引用此行:

@synthesize delegate = _delegate;

该变量声明为:

@property (weak, nonatomic) IBOutlet id <FlipsideViewControllerDelegate> delegate;

我了解到iOS 4不支持“弱引用”,但我真的不明白为什么我要使用弱引用作为开始,也无法弄清楚如何重写内容以避免使用它仍在利用ARC(毕竟,它应该可以在iOS 4和5上使用,对吧?)

Answers:


149

要定位较早的操作系统,可以在属性声明中使用,unsafe_unretained而不是使用weak它,并且大多数情况下应该以相同的方式工作。 weak当目标消失时,引用自身为零,但是unsafe_unretained打开的可能性是,与您链接的对象在释放时可能变成悬挂的指针。后者的行为与您assign在手动内存管理中用作属性声明的行为相同。

您这样做是为了避免保留周期,我在此处的答复中提到了这一点。您不希望有强大的指针指向可能具有指向原始对象的强大指针的对象。然后什么也不会被正确释放。


谢谢你的建议。您说“以较早的操作系统为目标...”。这是否意味着我只能在版本低于5.0的应用程序中使用unsafe_unretained?还是可以在代码中使用unsafe_unretained并将其构建为同时针对4.x和5.x?
Mason G. Zhwiti 2011年

1
@Mason- unsafe_unretainediOS 4.x和5.0均受支持,因此它向后兼容。如果您正在执行仅5.0版本的构建,则可以切换到weak利用它提供的附加安全性。
布拉德·拉尔森

我尝试过unsafe_unretained,它仍然可以工作。但是,我得到了很多警告,例如'“ ** __NSAutoreleaseNoPool():__NSArrayM类的对象0x564bd90在没有池的情况下自动释放-只是泄漏了” *“,这是正常的吗?
第五

1
@fifth-这是一个完全不相关的问题。您正在后台线程上运行某些程序,而没有自动释放池。手动创建的线程没有自己的自动释放池,因此您需要自己创建一个@autoreleasepool(在ARC下,NSAutoreleasePool用于较早的手动引用计数实现)。
布拉德·拉尔森

@Brad,这很有帮助,警告不见了,我接到了几个performSelectorInBackground调用。
第五

11

如果仅使用弱引用来提高安全性,请手动调用新的运行时函数(如果可用),否则将退回给__unsafe_unretained变量进行简单分配。

ZWRCompatibility.h将稍微简化此过程。


10

多亏了Mike Ash的兼容性库PLWeakCompatibilty,您现在也可以在iOS 4.x上简单地使用__weak。

它非常易于配置,并且在5.x上不需要任何额外的考虑或努力。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.