使用 ARC 声明委托属性的推荐方法
Posted
技术标签:
【中文标题】使用 ARC 声明委托属性的推荐方法【英文标题】:Recommended way to declare delegate properties with ARC 【发布时间】:2011-10-13 12:04:26 【问题描述】:我曾经将所有委托属性声明为
@property (assign) id<FooDelegate> delegate;
我的印象是所有的赋值属性现在都应该是弱指针,这是正确的吗? 如果我尝试声明为:
@property (weak) id<FooDelegate> delegate;
我在尝试 @synthesize 时遇到错误(不支持自动生成的弱属性)。
在这种情况下,最佳做法是什么?
【问题讨论】:
这是一个很好的问题,答案不是很确定。我本来想使用weak,但Apple框架使用assign(请参阅仅在ios5+上可用的UIPageViewController)。 【参考方案1】:Xcode 4 重构 > 转换为 Objective-C ARC 转换:
@interface XYZ : NSObject
id delegate;
@property (assign) id delegate;
...
@synthesize delegate;
进入:
@interface XYZ : NSObject
id __unsafe_unretained delegate;
@property (unsafe_unretained) id delegate;
...
@synthesize delegate;
如果我没记错的话,WWDC 2011 视频中也提到了 ARC。
【讨论】:
我再看看视频。 为什么不改用weak
?
这与 2 年前有关,当时地球上出现了一个年轻的铿锵声和老式 iOS SDK。【参考方案2】:
对于面向 iOS 4 和 5 的 ARC 项目,使用 __unsafe_unretained
而不是 weak
。唯一的区别是 weak
在释放时将指针归零,并且仅在 iOS 5 中受支持。
Why are Objective-C delegates usually given the property assign instead of retain? 已回答您的其他问题。
【讨论】:
但是,我正在为 iOS 5 编译它,所以我想它应该可以工作...... :-? 这很奇怪,如果你的“部署目标”是 5.0,它应该只适用于(弱)。以上是关于使用 ARC 声明委托属性的推荐方法的主要内容,如果未能解决你的问题,请参考以下文章