当copy修饰的String属性赋值时的对象是一个不可变对象的时候, 不会发生内存的拷贝行为, 只是发生了指针的强引用(指针重新指向);
当copy修饰的String属性赋值的对象是一个可变对象的时候才会发生内存的拷贝;
用strong修饰NSString:对象属性和源字符串公用了一块内存,源字符串的引用计数+1;
为什么日常开发NSString属性用copy修饰:
例如用一个可变字符串A给用copy修饰的属性B赋值则A再次拼接改变的时候, B的值不会变,因为copy出来一块新的内存区域; 而用strong修饰的时候A改变时B也会跟着改变,因为strong强行引用指针,是同一块内存区域
为什么日常开发NSMutableString属性用strong修饰:
用copy修饰的时候其实拷贝出来的一块内存区域是不可变, 用一个可变字符串给他赋值, 然后拼接这个属性时就会崩溃, 用strong修饰的时候就不会出现这种情况, 因为strong修饰后是指针强引用, 始终指向的同一块内存区域
为什么日常开发NSArray属性用copy修饰:
如果用strong修饰的话,用一个可变数组给他赋值,然后可变数组改变后,这个NSArray内容也会跟着改变,这明显有违背NSArray原则, 但是用copy修饰的话这时用可变数组给其赋值,相当于是重新拷贝了一份内存区域;
为什么日常开发NSMutableArray属性用strong修饰:
类似于NSMutableString的问题,如果用copy修饰这个数组,相当于copy了一份不可边的内存区域, 你对他更改的时候就会crash
iOS 集合类和非集合类的copy和mutableCopy