86

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

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

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

它引用了这一行:

@synthesize delegate = _delegate;

该变量声明为:

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

我知道 iOS 4 不支持“弱引用”,但我真的不明白为什么我要使用弱引用开始,我也不知道如何重写东西以避免使用它,而仍在利用 ARC(毕竟,它应该适用于 iOS 4 和 5,对吧?)

4

3 回答 3

149

要针对较旧的操作系统,您可以在属性声明中使用unsafe_unretained而不是weak,它应该以相同的方式工作。 weak当他们的目标消失时引用 nil 本身,但unsafe_unretained留下了您链接到的对象在释放时可能变成悬空指针的可能性。assign后者与您在手动内存管理中用作属性声明的行为相同。

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

于 2011-08-05T17:41:59.800 回答
11

如果仅使用弱引用来提高安全性,请手动调用新的运行时函数(如果它们可用),__unsafe_unretained如果不可用则回退到对变量的简单赋值。

ZWRCompatibility.h会稍微简化这一点。

于 2011-08-29T02:48:21.400 回答
10

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

它非常容易配置,并且不需要超过 5.x 的额外考虑或努力。

于 2012-06-28T20:58:30.457 回答