當你聲明一個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不會有任何影響我們的字符串值,在大多數情況下這是我們想要的。