Through the Chaos!

==================> 知我罪我,唯有春秋!

OC代理设计模式中delegate属性在assign和weak之间的选择

在ARC之前,使用代理,我们常用assign表示代理属性,来防止出现“循环引用”,在苹果引入ARC之后,使用weak类型指针是一个更好的选择。但是,在苹果现有的系统库中,我们仍然可以看到使用assign标示代理指针的属性。

比如,很常用的UIScrollView控件中的代理就仍然使用assign:

// default nil. weak reference
@property(nonatomic,assign) id<UIScrollViewDelegate> delegate;

很明显,weak因为可以自动地被设置为nil,防止了“悬挂指针”的出现,但是在某些情况下,assign仍然是一个更好的选择。

比如在下面两种情况下,assign是一个更好的选择:

  1. 需要在对象销毁时执行一些操作。

因为如果使用weak,我们无法具体的知晓对象什么时候被销毁;而使用assign,因为我们需要手动进行指针的赋值为空指针,我们可以控制对象的销毁时刻,在这里我们可以进行一些需要的操作。

  1. 一些类库不支持weak(或不支持ARC)

实际上,苹果的系统库中就经常混用assign和weak,尤其是OSX的一些库中,因为有一些类库还不支持weak,甚至不支持ARC。

Comments

comments powered by Disqus