OC中用于内存管理的属性修饰符有:copy、strong、weak、assign、unsafe_unretained等等。
对于copy、strong修饰OC中可变/不可变集合比如NSArray和NSMutableArray有什么不同呢?
做个简单的测试
@interface ArrayTest ()
@property (nonatomic, copy) NSArray *arr1;
@property (nonatomic, copy) NSMutableArray *arr2;
@property (nonatomic, strong) NSArray *arr3;
@property (nonatomic, strong) NSMutableArray *arr4;
@end
- (void)test{
NSArray*arr =@[@1,@2,@3];
self.arr1= arr;
self.arr2= arr;
self.arr3= arr;
self.arr4= arr;
// 不管用 stong/copy 修饰 NSArray/NSMutableArray 如果赋值的是一个 arr 最后都会得到一个和arr同地址的NSArray
[self printInfoWithArray:arr];
arr = arr.mutableCopy;
// 用 copy 修饰 NSArray 如果赋值的是一个 mutableArr 会重新拷贝一份 ,得到的是一个新地址的NSArray
self.arr1= arr;
// 用 copy 修饰 NSMutableArray 如果赋值的是一个 mutableArr 也会重新拷贝一份 arr,得到的是一个新地址NSArray
self.arr2= arr;
// 用 strong 修饰 NSArray 如果赋值的是一个 mutableArr 得到的是原来的可变数组
self.arr3= arr;
// 用 strong 修饰 NSMutableArray 如果赋值的是一个 mutableArr 得到的是原可变数组,所以存放网络返回数据的数据源数组。大多用strong修饰
self.arr4= arr;
[self printInfoWithArray:arr];
}
- (void)printInfoWithArray:(NSArray *)arr {
printf("\n====== begin ======\n");
printf("arr \t\t %s \t\t %p\n", NSStringFromClass(arr.class).UTF8String, arr);
printf("arr1 \t\t %s \t\t %p\n", NSStringFromClass(self.arr1.class).UTF8String, self.arr1);
printf("arr2 \t\t %s \t\t %p\n", NSStringFromClass(self.arr2.class).UTF8String, self.arr2);
printf("arr3 \t\t %s \t\t %p\n", NSStringFromClass(self.arr3.class).UTF8String, self.arr3);
printf("arr4 \t\t %s \t\t %p\n", NSStringFromClass(self.arr4.class).UTF8String, self.arr4);
printf("====== end ======\n");
}
下面是输出结果
_aaa.png
综上,oc中的集合,建议使用strong修饰,尤其是可变集合,以免重新分配地址引起不必要的麻烦。
网友评论