使用COPY聲明NSSTRING屬性

聲明一個NSString屬性使用copy要優於使用strong。這同樣適用於遵守NSCoding協議的不可變類(immutable class),如NSNumber、NSArray、NSSet等。上面提到的這些類都有一個可變(mutable)的版本。選擇使用copy的理由是,NSString屬性可能被傳入一個NSString實例,也可能是一個NSMutableString實例。當傳入了一個NSMutableString實例時,字符串的值可能會在背後悄悄變化。來瞧瞧這個例子:

@interface Book : NSObject
@property (strong, nonatomic) NSString *title;
@end

在另一個類中,我們有一個這樣的方法:

- (void)stringExample {
 NSMutableString *bookTitle = [NSMutableString stringWithString:@"Best book ever"];
 
 Book *book = [[Book alloc] init];
 book.title = bookTitle;

 [bookTitle setString:@"Worst book ever"];
 NSLog(@"book title %@", book.title);
}

運行後會發現,圖書的標題是“Worst book ever”。如果我們更改爲使用copy聲明title屬性,圖書的標題變爲了“Best book ever”,這也是我們想要的結果。在第一種情況下,我們使用strong聲明該屬性,字符串的retain計數將增加1,屬性與字符串指向同一個內存地址。這意味着任何指向這個內存地址的變量都可改變這個值,本例中bookTitle變量的值改變後,title屬性值也跟隨變化。如果改用copy的話,則會爲Book類創建一個字符串副本。也就是說修改booTitle,不再會影響字符串副本值,這是多數情況下我們想要的結果。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章