您的位置:首页 > 移动开发 > IOS开发

iOS中delegate代理对象使用weak

2016-03-31 08:43 302 查看
之前不停应用的是assign,本日调试一段代码的时间,发明顺序会crash失落,报错EXC_BAD_ACCESS 经由一番研讨,发明若是应用 @property (nonatomic, assign, readwrite) id delegate;
声明一个delegate,那末即] 

之前一直使用的是assign,今天调试一段代码的时候,发现程序会crash掉,报错EXC_BAD_ACCESS

经过一番研究,发现如果使用

@property (nonatomic, assign, readwrite) id delegate;

声明一个delegate,那么即便delegate指向的对象销毁了,delegate中依然会保存之前对象的地址

即,delegate成为了一个野指针...

而使用weak,则不会有上述问题,当delegate指向的对象销毁后,delegate = nil

--------------------------------------------

所以答案就是,使用weak。

代理             weak

UILabel ,控件      strong

NString            Copy

int 数据类型的   assign

下面两种方式都是弱引用代理对象,但是第一种在代理对象被释放后不会导致崩溃,而第二种会导致崩溃。

 

1

2
@property (nonatomic, weak) iddelegate;


@property (nonatomic, assign) iddelegate;


weak和assign是一种“非拥有关系”的指针,通过这两种修饰符修饰的指针变量,都不会改变被引用对象的引用计数。但是在一个对象被释放后,weak会自动将指针指向nil,而assign则不会。在iOS中,向nil发送消息时不会导致崩溃的,所以assign就会导致野指针的错误unrecognized selector sent to instance。

所以我们如果修饰代理属性,还是用weak修饰吧,比较安全。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: