在定義一個類的property時候,為property選擇strong還是copy特別注意和研究明白的,如果property是NSString或者NSArray及其子類的時候,最好選擇使用copy屬性修飾。為什么呢?這是為了防止賦值給它的是可變的數據,如果可變的數據發生了變化,那么該property也會發生變化。
代碼示例
還是結合代碼來說明這個情況
@interfacePerson:NSObject
@property(strong,nonatomic)NSArray*bookArray1;
@property(copy,nonatomic)NSArray*bookArray2;
@end
@implementationPerson//省略setter方法
@end//Person調用
main(){NSMutableArray*books = [@[@"book1"] mutableCopy];? ?
?Person *person = [[Person alloc] init];? ?
?person.bookArray1= books;??
? person.bookArray2= books;??
? [books addObject:@"book2"];NSLog(@"bookArray1:%@",person.bookArray1);
NSLog(@"bookArray2:%@",person.bookArray2);}
我們看到,使用strong修飾的person.bookArray1輸出是[book1,book2],而使用copy修飾的person.bookArray2輸出是[book1]。這下可以看出來區別了吧。
備注:使用strong,則person.bookArray1與可變數組books指向同一塊內存區域,books內容改變,導致person.bookArray1的內容改變,因為兩者是同一個東西;而使用copy,person.bookArray2在賦值之前,將books內容復制,創建一個新的內存區域,所以兩者不是一回事,books的改變不會導致person.bookArray2的改變。
說到底,其實就是不同的修飾符,對應不同的setter方法,
1. strong對應的setter方法,是將_property先release(_property release),然后將參數retain(property retain),最后是_property = property。
2. copy對應的setter方法,是將_property先release(_property release),然后拷貝參數內容(property copy),創建一塊新的內存地址,最后_property = property。