【问题标题】:Recommended way to declare delegate properties with ARC使用 ARC 声明委托属性的推荐方法
【发布时间】:2011-10-13 12:04:26
【问题描述】:

我曾经将所有委托属性声明为

@property (assign) id<FooDelegate> delegate;

我的印象是所有的赋值属性现在都应该是弱指针,这是正确的吗? 如果我尝试声明为:

@property (weak) id<FooDelegate> delegate;

我在尝试 @synthesize 时遇到错误(不支持自动生成的弱属性)。

在这种情况下,最佳做法是什么?

【问题讨论】:

  • 这是一个很好的问题,答案不是很确定。我本来想使用weak,但Apple框架使用assign(请参阅仅在iOS5+上可用的UIPageViewController)。

标签: objective-c cocoa-touch delegates automatic-ref-counting


【解决方案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,它应该只适用于(弱)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
相关资源
最近更新 更多