iOS中copy属性与setter赋值

这样定义时,下面两种写法会是什么结果 ?
@property (copy) NSMutableArray* test;

写法1
NSMutableArray* arr = [NSMutableArray arrayWithObjects:@1,@2, nil];
self.test = arr;
[self.test removeObjectAtIndex:0];

写法2
NSMutableArray* arr = [NSMutableArray arrayWithObjects:@1,@2, nil];
_test = arr;
[self.test removeObjectAtIndex:0];

设为copy 属性之后,利用setter赋值拷贝的是不变的数据即NSArray,所以方法1会崩溃,而方法二是直接给变量赋值,应该是默认的__strong 属性,下面验证一下
这里写图片描述
地址是一样的,说明不是拷贝
这里写图片描述
执行这句话之后
这里写图片描述
再次证明是引用关系
把arr置为nil之后
这里写图片描述
说明是强引用关系
另外函数内开辟的空间,如果通过返回值返回回来之后是会一直存在的,直到autorelease}结束。
说明内部定义的变量是属于强引用,也就是说变量的默认属性是强引用,除非定义了weak

上述例子也说明retain/copy/assign是在setter内实现的,如果跳过setter上述属性将会失效

weak属性用不用setter是一样的
unsafe_unretain与weak的区别在于,当被引用的对象置为nil后,weak变量也会置为nil, 而unsafe_unretain的则变成野指针,访问可能会崩溃。

NSString* a = @”test”;
__weak NSString* b = a;
b = nil; //此时对b的修改并不影响a; 但是如果是a修改的话,b的值也会一起变化

你可能感兴趣的:(iOS学习)