又是一个老掉牙的问题,真想加一个捂脸的表情。
最近的项目开发中使用了assign修饰了delegate,当初写的时候脑瓜还闪现了一句:assign、weak都一样,写assign吧。果然在测试中发现dealloc方法不走了,这回发愁了,是什么没有释放导致VC不能正常释放。于是首先是对block进行检查,果然还真发现两个可能引起循环应用的地方,改了之后再次测试还是不行。于是就又马上盯上了assign这个代理。用weak尝试,立马生效。
接下来心得又来了,默默的下定决心,以后要规范代码,使用weak修饰。
assign: 简单赋值,不更改索引计数,对基础数据类型 (例如NSInteger,CGFloat)和C数据类型(int, float, double, char, 等) 适用简单数据类型,此标记说明设置器直接进行赋值,这也是默认值。在使用垃圾收集的应用程序中,如果你要一个属性使用assign,且这个类符合NSCopying协 议,你就要明确指出这个标记,而不是简单地使用默认值,否则的话,你将得到一个编译警告。这再次向编译器说明你确实需要赋值,即使它是可拷贝的。
weak:由于weak是在arc下出现的,arc 的规则非常简单:只要还有一个变量指向对象,对象就会保持在内存中。当指针指向新值,或者指针不再存在时,相关联的对象就会自动释放。这条规则对于实例变量、synthesize属性、局部变量都是适用的不用去管计数问题,所以,weak型的指针变量可以指向一个对象,但不属于对象的拥有者,通常现在的开发都是arc之下所以,weak比assign多了一个功能,当对象消失后自动把指针变成nil
最后:weak相当于老版本的assign(strong相当于retain),但是不同的是,由于arc和mrc机制不同,两者带来的变化也稍有区别
网友评论