数组的修饰符
程序员文章站
2022-07-15 08:03:40
...
个人理解,只为加深印象,有疑问可留言进行交流,谢谢大家!!
我一直习惯用strong来修饰NSArray,好多同事也是如此,网上还有很多人说除了NSString用copy,其他对象类型都用strong。但是大家有没有考虑过当用strong修饰NSArray的时候,如果遇到用可变数组给它赋值怎么办?
@property (nonatomic ,strong)NSMutableArray *marray;
@property (nonatomic ,strong)NSArray *array;
//执行如下代码
self.marray = [NSMutableArray arrayWithObjects:@1, nil];
self.array = [NSArray array];
self.array = self.marray;
[self.marray addObject:@2];
NSLog(@"%@",self.marray);
NSLog(@"%@",self.array);
运行结果如下:
2017-01-13 14:40:47.384 copy使用[13866:1061182] self.marray = (
1,
2
)
2017-01-13 14:40:47.386 copy使用[13866:1061182] self.array = (
1,
2
)
也就是说,self.array在没有被直接操作的情况下,跟着self.mutableArray 变化了,这是很危险的。
如果把self.array用copy修饰的话:
@property (nonatomic ,copy)NSArray *array;
运行结果如下:
2017-01-13 14:43:45.291 copy使用[13909:1062768] self.marray = (
1,
2
)
2017-01-13 14:43:45.292 copy使用[13909:1062768] self.array = (
1
)
这次self.array不会跟随self.mutableArray 变化了。
使用copy修饰对象,会重新开辟一片新的内存,内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。所以再次修改self.mutableArray的时候self.array是不受影响的
如果可变数组给可变数组赋值的情况下,用copy修饰就会出现崩溃
@property (nonatomic ,copy)NSMutableArray *marray;
@property (nonatomic ,copy)NSMutableArray *mutableArray;
//修饰可变数组要用strong,如果用copy修饰会出现莫名的崩溃
self.mutableArray = [NSMutableArray arrayWithObjects:@1,@2, nil];
self.marray = self.mutableArray;
NSLog(@"self.marray = %@",self.marray);
NSLog(@"self.mutableArray = %@",self.mutableArray);
[self.marray removeObjectAtIndex:0];
运行结果
[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x608000029e80
如果换成strong修饰就ok了
@property (nonatomic ,strong)NSMutableArray *marray;
@property (nonatomic ,strong)NSMutableArray *mutableArray;
self.marray = (
1,
2
)
2017-01-13 15:09:49.834 copy使用[14265:1076860] self.mutableArray = (
1,
2
)
个人觉得,如果用copy修饰可变数组的话,因为对这个数组进行了增删改操作,而copy后的数组变成了不可变数组