变更记录
序号 | 录入时间 | 录入人 | 备注 |
---|---|---|---|
1 | 2016-01-20 | Alfred Jiang | - |
方案名称
语法 - MRC 下全局变量的 Delegate 陷阱
关键字
语法 \ Objective-C \ MRC \ 成员变量 \ Delegate
需求场景
- 使用全局变量时赋值 delegate 需要注意的地方
参考链接
(无)
详细内容
在 MRC 代码中,当我们对全局成员变量的 delegate 进行赋值时,一定要记得在 dealloc 中释放该全局变量的同时对其中的 delegate 进行置 nil 操作。
否则会在下面的代码中造成 crash。
if (delegate && [delegate respondsToSelector:@selector(anymethod:)])
{
[delegate anymethod:nil];
}
原因是 MRC 中 delegate 为 assign 修饰,assign 修饰在 self 置 nil 时该变量并不会置 nil。
所以我们必须在 dealloc 中显式的对 delegate 进行置 nil 操作。
与之对应的 ARC 中 delegate 为 weak 修饰,weak 修饰在 self 置 nil 时会自动对 delegate 进行置 nil 操作。
这也算是 ARC 的一个进步之处吧,缺点是 weak 的对象必须是 Objective-C 的对象。而 assign 可以修饰简单数据类型。
效果图
(无)
备注
(无)