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则程序很可能会崩溃。
上一篇: 全排列总结
推荐阅读
-
关系型数据库与NOSQL数据库的区别
-
Oracle中的Char与Varchar的区别和实例
-
MySQL null与not null和null与空值''''的区别详解
-
php提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
-
PHP中SERIALIZE和JSON序列化与反序列化的区别
-
Vue.mixin Vue.extend(Vue.component)的原理与区别
-
基于Vue全局组件与局部组件的区别说明
-
php中类继承与接口继承的区别是什么
-
jquery选择器中的空格与大于号>、加号+与波浪号~的区别
-
静态与实例变量的区别——(面试题)