為啥NSString的屬性要用copy而不用retain
之前學習生活中,知道NSString的屬性要用copy而不用retain,但是不知道為啥,這兩天我研究了一下,然後終於明白了.
具體原因是因為用copy比用retain安全,當是NSString的時候,其實用copy和retain都行,當用NSMutableString,那麼就要用copy,NSMutableString的值不會被修改,而用retain的時候,NSMutableString的值會被修改,具體情況,可以看下面的代碼:
#import <Foundation/Foundation.h>//協議有兩種方式,第一是以ing結尾形式,第二,以delegate結尾形式@interface person : NSObject<NSCopying>@property (nonatomic,copy)NSString * name;
person * p = [[person alloc]init]; NSMutableString * name = [[NSMutableString alloc]initWithString:@"hello"]; p.name = name; [name appendString:@" word"]; NSLog(@"%@",p.name);
列印後結果是
2014-07-05 17:08:44.170 DepthCopy[1399:303] helloProgram ended with exit code: 0
我們可以發現列印結果還是hello;
再看下面用retain
#import <Foundation/Foundation.h>//協議有兩種方式,第一是以ing結尾形式,第二,以delegate結尾形式@interface person : NSObject<NSCopying>@property (nonatomic,retain)NSString * name;
person * p = [[person alloc]init]; NSMutableString * name = [[NSMutableString alloc]initWithString:@"hello"]; p.name = name; [name appendString:@" word"]; NSLog(@"%@",p.name);
列印結果是:
2014-07-05 17:13:19.531 DepthCopy[1412:303] hello wordProgram ended with exit code: 0
我們可以發現結果被改變了,成為了hello word;
所以,由以上代碼,可以看出copy比retain安全,也就能明白為啥NSString的屬性要用copy而不用retain了;