如何在使用ARC和定位iOS 4.0时替换弱引用?

Mas*_*iti 87 iphone ios automatic-ref-counting

我已经开始使用Xcode 4.2开发我的第一个iOS应用程序,并且使用"实用程序应用程序"模板(FlipsideViewController附带的模板)定位iOS 5.0.

我读到,因为ARC是一个编译时功能,它也应该与iOS 4兼容,所以我试图将我的应用程序定位到4.3,并尝试编译它.当我这样做时,我收到此错误:

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

它引用了这一行:

@synthesize delegate = _delegate;
Run Code Online (Sandbox Code Playgroud)

该变量声明为:

@property (weak, nonatomic) IBOutlet id <FlipsideViewControllerDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)

我知道iOS 4中不支持"弱引用",但我真的不明白为什么我想要使用弱引用开始,也不能弄清楚如何重写以避免使用它,同时仍然利用ARC(毕竟,它应该适用于iOS 4和5吗?)

Bra*_*son 149

要定位较旧的操作系统,您可以使用unsafe_unretained而不是weak在属性声明中,它应该以相同的方式工作. weak当目标消失时,引用nil自己,但是unsafe_unretained当你被解除分配时,你所链接的对象可能变成悬空指针.后者与您assign在手动内存管理中用作属性声明的行为相同.

你这样做是为了避免保留周期,我在这里的回答中提到.您不希望有一个强指针指向可能有强指针返回原始对象的东西.然后什么都不会被正确释放.


rpe*_*ich 11

如果仅使用弱引用以获得额外的安全性,则在新的运行时函数可用时手动调用它们,__unsafe_unretained如果不可用,则回退到变量的简单赋值.

ZWRCompatibility.h将稍微简化一下.


nsc*_*hum 10

感谢Mike Ash的兼容性库PLWeakCompatibilty,您现在也可以在iOS 4.x上使用__weak.

它非常容易配置,无需额外考虑或努力超过5.x.