代理修饰词weak/assign/strong的区别

基于项目报错:

WebViewJavascriptBridgeBase 中定义:
@property (assign) id <WebViewJavascriptBridgeBaseDelegate> delegate;

但是dealloc中没有释放

- (void)dealloc {
    self.startupMessageQueue = nil;
    self.responseCallbacks = nil;
    self.messageHandlers = nil;
}

这个是导致exc_bad_access(code=1,address=0x0)   (访问了已经释放的对象)这个crash的原因?

对于weak:指明该对象并不负责保持delegate这个对象,delegate这个对象的销毁由外部控制。

对于strong:该对象强引用delegate,外界不能销毁delegate对象,会导致循环引用(Retain Cycles)

对于assing:也有weak的功效。但是网上有assign是指针赋值,不对引用计数操作,使用之后如果没有置为nil,可能就会产生野指针;而weak一旦不进行使用后,永远不会使用了,就不会产生野指针。

也就是说:weak比assign多了一个功能,当对象消失后自动把指针变成nil。如果想在dellac中调用delegate的某些函数时候,如果是weak会找不到对象,因为被置空了。所以用assign 。

使用weak也是为了防止发生循环引用。

这篇文章写得很清楚:http://blog.csdn.net/zxl2016/article/details/51908853

 来自:http://www.jianshu.com/p/66b54e3a3960

http://www.cocoachina.com/bbs/read.php?tid=243250

此文仅为鄙人学习笔记之用,朋友你来了,如有不明白或者建议又或者想给我指点一二,请私信我。liuw_flexi@163.com/QQ群:582039935. 我的gitHub: (学习代码都在gitHub) https://github.com/nwgdegitHub/
原文地址:https://www.cnblogs.com/liuw-flexi/p/6742626.html