使用 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 声明委托属性的推荐方法的主要内容,如果未能解决你的问题,请参考以下文章

委托方法不会触发(为空)。使用 ARC

我应该在接口中声明变量还是在objective-c arc中使用属性?

循环和便利方法是不是会导致 ARC 出现内存峰值?

C# 委托

iOS优化内存方法推荐

C#委托和方法