爲什麼用copy for NSString屬性?

當你聲明一個NSString屬性最好使用copy而不是strong。事實上這適用於任何不可變類,符合NSCopying協議像NSNumber NSArray,NSSet等等。所有我提到的這些類也有一個可變的版本。你想使用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代替Strong,我們的書的標題就會變成“Best book ever”。在第一種情況下,當我們聲明屬性Strong,字符串的retain count將增加1,但我們的屬性將指向同一個內存地址。這意味着任何人都可以改變的value持有一個內存地址的引用,在我們的案例中bookTitle變量。如果相反的我們使用copy,那麼將會創建一個新的字符串複製我們的書類。這意味着修改booTitle不會有任何影響我們的字符串值,在大多數情況下這是我們想要的。

發佈了55 篇原創文章 · 獲贊 10 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章