NSArray、NSDictionary、NSString同理
NSArray的修饰符使用strong时,如果用可变数组给其赋值,会出现可变数组改变时,array也会改变的情况
这显然是不希望出现的
但是使用copy将不会出现此问题
NSMutableArray *mutableArray = [NSMutableArray array];
[mutableArray addObject:@"1"];
self.array = mutableArray;
self.arrayCopy = mutableArray;
DLog(@"!!! -- %@ ---%@",self.array,self.arrayCopy);
[mutableArray addObject:@"2"];
DLog(@"@@@ -- %@ ---%@",self.array,self.arrayCopy);
输出
[Line 64] array == (
1
) arrayCopy == (
1
)
[Line 67] array == (
1,
2
) arrayCopy == (
1
)
查看下三个对象的内存地址
[Line 70] mutableArray -- 0x600000459c80 array ---0x600000459c80 arrayCopy ----0x60000001d310
strong修饰的对象 直接赋值后 指针指向了可变数组的内存地址 没有创建新的内存 所以2个指针指向同一个内存 当然输出是一致的
copy修饰的对象 直接赋值后 创建了一个新的对象、新的内存地址 对象内容当然不会被改变
但是,数组的创建为什么要直接赋值呢?这个习惯很不好!为什么不用字面量或者方法来初始化。
这个直接赋值的操作本身就是有问题的 我在开发中根本不会这样写 从形式来看 这个操作就是把一个新指针指向了一个老的内存 系统输出这个结果也是正确的 所以 我认为还是要在开发细节上多注意 不要做这么奇怪的操作
字典、数组直接赋值对象看似是很奇怪的,那么只要注意不这样写也就不会出现问题。
而字符串的copy毋庸置疑 是一定要用的 因为字符的相互赋值看似并不奇怪