什么情况下用copy修饰属性?

记住:NSArrayNSDictionaryNSString最好用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修饰下,myStringmutableString指向了不同地址。这也是为什么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属性修饰词?我觉得还是有必要的啊!

你可能感兴趣的:(什么情况下用copy修饰属性?)