一、assign和weak的区别?
-
assign是MRC和ARC下都有的,可用来修饰对象和基本数据类型,当修饰对象时,不会使引用计数+1,但是在对象释放时,这个指针并不会赋值为nil,如果再次使用它就会出现野指针错误。
-
weak是ARC下,只能用来修饰对象类型,weak指针不会使对象引用计数+1,而且在对象销毁时,这个weak指针会自动赋值为nil,不会出现野指针错误。
二、为什么assign不会自动赋值为nil?
看MRC下的setter方法实现可知,assign直接是对属性的指针赋值为参数的指针,不会调用retain,所以计数器不会+1;ARC下对象销毁时会将weak引用表里面的指针逐个赋值为nil,对于assign没有这个操作,所以不会赋值为nil。
//assign环境下
-(void)setName:(NSString *)name{
_name = name;
}
//retain环境下
-(void)setName:(NSString *)name{
if (_name != name) {
[_name release];
_name = [name retain];
}
}
//copy环境下
-(void)setName:(NSString *)name{
if (_name != name) {
[_name release];
_name = [name copy];
}
}
网友评论