欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

weak与assign的区别

程序员文章站 2022-03-22 19:06:45
...

weak与assign的唯一区别在于,当指向的对象被释放掉之后,weak指针会自动置为nil。而assign指针会指向一个无效的地址。当通过指针去访问一个无效地址时,程序很可能会崩溃。

代码一(推荐)

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

代码二(不推荐)

@property (nonatomic, assign) id  <SubClassDelegate> delegate;

对于id格式的delegate来说,通常我们设置为weak而不是assign。如果设置为assign,则在代理实例被释放的时候,应该将代理设置为nil,这样可以解决崩溃的问题。

由于系统库例如UITableView之类的的代理还是使用的assign属性,所以在使用的时候应该注意在实例析构的时候将代理置为nil。

总结:

MRC 下面 delegate 用 assign,如果delegate指向的对象将要被释放,则在释放之前需将delegte设置为nil。
ARC 下面 delegate 请用weak。

例如ControllerA创建了ViewA,并将ViewA的代理设置为自身。
同时另一个ControllerB中也使用了ViewA。
现在ControllerA要析构了,因为ControllerB中仍保存有ViewA的引用,所以ControllerA析构之后ViewA仍存在,而此时ViewA的delegate指向的ControllerA已经被析构,一旦ViewA调用delegate则程序很可能会崩溃。