这样定义时,下面两种写法会是什么结果 ?
@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的值也会一起变化