在定義一個類的property時候,爲property選擇strong仍是copy特別注意和研究明白的,若是property是NSString或者NSArray及其子類的時候,最好選擇使用copy屬性修飾。爲何呢?這是爲了防止賦值給它的是可變的數據,若是可變的數據發生了變化,那麼該property也會發生變化。數組
仍是結合代碼來講明這個狀況atom
@interface Person : NSObject @property (strong, nonatomic) NSArray *bookArray1; @property (copy, nonatomic) NSArray *bookArray2; @end @implementation Person //省略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]。這下能夠看出來區別了吧。spa
備註:使用strong,則person.bookArray1與可變數組books指向同一塊內存區域,books內容改變,致使person.bookArray1的內容改變,由於二者是同一個東西;而使用copy,person.bookArray2在賦值以前,將books內容複製,建立一個新的內存區域,因此二者不是一回事,books的改變不會致使person.bookArray2的改變。code
說到底,其實就是不一樣的修飾符,對應不一樣的setter方法,
1. strong對應的setter方法,是將_property先release(_property release),而後將參數retain(property retain),最後是_property = property。
2. copy對應的setter方法,是將_property先release(_property release),而後拷貝參數內容(property copy),建立一塊新的內存地址,最後_property = property。內存