copy只能修饰不可变的对象,因为修饰可变的对象会得到一个不可变的对象,在调用可变对象的方法时会导致程序崩溃。例如copy修饰的NSMutableArray得到的是一个NSArray,这个时候你去调用addObjiect:方法就会导致程序崩溃。
copy修饰的对象会重新复制一份所赋的值,例如有一个NSString * name被赋值了‘张三’,‘张三’的内存地址为0x600000267a70,copy修饰的name会重新开辟一个新的内存地址如0x6000002670a7,而strong修饰的name不会重新开辟新的内存地址,会使0x600000267a70内存地址的引用计数加1,所以当你修改‘张三’值的时候,strong修饰的name会随着改变,copy修饰的name不会改变。
深拷贝与完全拷贝
copy只会是把修改的对象重新开辟内存空间,不会重新开辟内存存储对象的内容(也可以理解为copy只会复制第一层对象,不会复制下面第二层,第三层...内容)如:NSString*name = @“张三”,创建了一个Model*A,A有一个copy修饰的sex属性,A.sex = name;,此时A.sex会重新分配一个内存地址,指向存储“张三”的这块内存地址。
NSMutableArray *arrM2 = [[NSMutableArray alloc] initWithArray:arrM1 copyItems:YES];此方法只能解决第二层的复制问题,但对于第三层,第四层无法复制,要想解决此问题可以使用 [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:object]];,该方法会返回一个id对象
下图为对象的copy与mutableCopy方法的使用说明