之前在開發(fā)的過程中仰坦,對定義類的屬性用stong
還是copy
總是有一點迷惑落萎,現(xiàn)在結(jié)合代碼來鞏固一下認知锄禽。
定一一個Person
類,類中定義兩個屬性疹蛉,分別用stong
和copy
修飾。
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, strong) NSString *strongString;
@property (nonatomic, copy) NSString *copyString;
@end
在定義一個可變字符串段标,分別賦值給這兩個屬性涯冠,然后改變可變字符串的值,看看有什么變化逼庞。
先測strong
蛇更。
Person *person = [[Person alloc] init];
NSMutableString *name = [NSMutableString stringWithFormat:@"李三"];
person.strongString = name;
NSLog(@"name沒改之前person.name=%@",person.strongString);
[name setString:@"王武"];
NSLog(@"name改之后person.name=%@",person.strongString);
NSLog(@"name=%@,%p",name,&name);
從輸出結(jié)果我們可以看到person.strongString
的值在name
被修改之后燁跟著修改了。根據(jù)結(jié)果知道person.strongString
和name引用同一個內(nèi)存地址赛糟。
現(xiàn)在測copy
NSMutableString *name = [NSMutableString stringWithFormat:@"李三"];
person.cpyString = name;
NSLog(@"name沒改之前person.cpyString=%@",person.cpyString);
[name setString:@"王武"];
NSLog(@"name改之后person.cpyString=%@",person.cpyString);
NSLog(@"name=%@,%p",name,&name);
輸出結(jié)果是在
name
沒有改變之后派任,person.cpyString
沒有改變。所以name
和person.cpyString
沒有引用同一個內(nèi)存地址璧南。
總結(jié)
- 當原字符串是
NSString
時掌逛,字符串是不可變的,不管是strong
還是copy
屬性的對象司倚,都是指向原對象豆混。 - 當原字符串是
NSMutableString
時篓像,strong
屬性只是增加了原字符串的引用計數(shù),而copy
屬性則是對原字符串做了次深拷貝崖叫,產(chǎn)生一個新的對象遗淳,且copy
屬性對象指向這個新的對象,且這個Copy屬性對象的類型始終是NSString拍柒,而不是NSMutableString心傀,因此其是不可變的。(總結(jié)原文地址http://blog.csdn.net/xdrt81y/article/details/63251879)