Bloodline's Blog Notes and thoughts from Bloodline

关于copy

Comments

前言

这也是一个丢人的问题。真的清楚某些属性为什么要用copy么?

讨论

下面的代码输出什么?

NSString *str = @"ABC";
    
Person *p = [[Person alloc] init];
p.stringStrong = str;
p.stringCopy = str;
    
str = @"QWE";
    
NSLog(@"%@", p.stringStrong);
NSLog(@"%@", p.stringCopy);

其实都是输出 ABC 。看图,考虑下内存的话很容易得出结果。虚线表示改变后的指针指向,不代表weak。

copy-1 copy-2

延伸

那岂不是跟copy和strong没区别了么?再看:

NSMutableString *str = [NSMutableString stringWithFormat:@"ABC"];
    
Person *p = [[Person alloc] init];
p.stringStrong = str;
p.stringCopy = str;
    
[str appendFormat:@"QWE"];
    
NSLog(@"%@", p.stringStrong);
NSLog(@"%@", p.stringCopy);

输出为ABCQWEABC。还是看内存图:

copy-3

当之前的str为可变字符串的时候,由于strong修饰的stringStrong属性则不会分配新的内存,所以str后添加新字符串则stringStrong也被改变。所以最好使用copy修饰。当然,如果在赋值的时候能够很清楚的使用p.stringStrong = [str copy];,当然也不会出问题,但是谁能保证不会忘了copy呢。