记住:NSArray
、NSDictionary
、NSString
最好用copy
来修饰。
表面原因:
主代码
NSMutableString *mutableString = [NSMutableString stringWithFormat:@"111"];
self.myString = mutableString;
NSLog(@"%@",self.myString);
[mutableString appendString:@"222"];
NSLog(@"%@",self.myString);
strong和copy修饰下打印结果:
//storng
@property (strong, nonatomic) NSString *myString;
输出:
CocoaPodsDemo[78349:7152331] 111
CocoaPodsDemo[78349:7152331] 111222
//copy
@property (copy, nonatomic) NSString *myString;
输出:
CocoaPodsDemo[78543:7157043] 111
CocoaPodsDemo[78543:7157043] 111
说明:
可以看到,在strong修饰下,把可变字符串mutableString
赋值给myString
后,改变mutableString
的值导致了```myString``值的改变。而copy修饰下,却不会有这种变化。
本质原因:
上面代码打印了结果,那么我们打印指针指向的地址看看
主代码:
NSMutableString *mutableString = [NSMutableString stringWithFormat:@"111"];
self.myString = mutableString;
NSLog(@"%p",mutableString);
NSLog(@"%p",self.myString);
[mutableString stringByAppendingString:@"222"];
NSLog(@"%p",mutableString);
NSLog(@"%p",self.myString);
strong和copy修饰下打印结果:
//strong
@property (strong, nonatomic) NSString *myString;
输出:
CocoaPodsDemo[79846:7182366] 0x7fcb0371f6b0
CocoaPodsDemo[79846:7182366] 0x7fcb0371f6b0
CocoaPodsDemo[79846:7182366] 0x7fcb0371f6b0
CocoaPodsDemo[79846:7182366] 0x7fcb0371f6b0
//copy
@property (copy, nonatomic) NSString *myString;
输出:
CocoaPodsDemo[79648:7178898] 0x7f9473e49660
CocoaPodsDemo[79648:7178898] 0xa000000003131313
CocoaPodsDemo[79648:7178898] 0x7f9473e49660
CocoaPodsDemo[79648:7178898] 0xa000000003131313
说明:
在strong修饰下,可变字符串赋值给myString
后,两个对象都指向了相同的地址。而copy修饰下,myString
和mutableString
指向了不同地址。这也是为什么strong修饰下,修改mutableString
引起myString
变化,而copy修饰下则不会。
为什么会有上述差异?
myString
是copy修饰情况下,把一个值赋值给myString
实际上进行的是:self.myString = [mutableString copy];
操作。同时要注意-copy
方法分对可变对象和不可变对象的操作。如果是对可变对象操作(如上述````NSMutableString),那么会返回一个指向不同地址的不可变对象。如果对一个不可变对象(如NSString)的操作,那么会返回一个指向相同地址的不可变对象。(具体看我另一篇copy和mutableCopy的区别文章。)
如果没看明白这段文字,那么记住:
必须使用copy的情况是:
1.属性是一个不可变对象,如NSString,NSArray.
2.需要把一个可变对象赋值给属性,如上面代码中把NSMutableString赋值给NSString.
除此之外的情况,使用copy和strong是没区别的。
所以copy修饰也可以看做默认为strong修饰的属性增加了一个步骤:
@property (strong, nonatomic) NSString *myString;
NSMutableString *mutableString = [NSMutableString stringWithFormat:@"111"];
//这一步就是copy的作用
NSString *copyString = [mutableString copy];
self.myString = copyString;
为什么copy不能修饰可变属性?
自己的理解:
NSString *copyString = [mutableString copy];
因为-copy方法返回的一定是不可变对象,那么可变属性用copy修饰就有问题了。
话说为什么没有mutableCopy属性修饰词?我觉得还是有必要的啊!