iOS NSString,NSArray,NSDictionary聲明屬性關鍵字

這幾天看面試題,就看到這個問題,NSSArray類型做變量聲明屬性時,屬性關鍵字用什麼比較好?想當然的就是用strong來修飾,只知道NSString類型做變量聲明屬性是copy,其實也不知道爲什麼.今天晚上就在網上查詢了下究竟是爲什麼.

在網上就看到個例子,下面上代碼:

創建了Person類,裏面聲明個name屬性,關鍵字用copy

@property (nonatomic, copy)NSString *name;

在ViewController裏給name賦值

NSMutableString *str = [[NSMutableString alloc] initWithString:@”iPhone”];

Person *person = [[Person alloc]init];

person.name = str;

[str appendString:@”6”];

NSLog(@”\n%@\n%@”, str, person.name);

NSLog(@”\n%p\n%p”, str, person.name);

下面來看下打印結果:



關鍵字copy打印結果

下面用strong來當關鍵字,來做下對比:

@property (nonatomic, strong)NSString *name;

在ViewController裏給name賦值

NSMutableString *str = [[NSMutableString alloc] initWithString:@”iPhone”];

Person *person = [[Person alloc]init];

person.name = str;

[str appendString:@”6”];

NSLog(@”\n%@\n%@”, str, person.name);

NSLog(@”\n%p\n%p”, str, person.name);

看下最關鍵的打印結果:



關鍵字strong打印結果

這回大家看到不同了吧,如果strong來修飾,如果NSMutableString的值賦值給NSString,那麼只是將NSString指向了NSMutableString的內存地址,並對NSMUtbaleString計數器加一,此時,如果對NSMutableString進行修改,也會導致NSString的值修改,person的name屬性會隨着str的改變而改變,(試想一下一個人的名字怎麼能在不知情的情況下被被改變那),破壞了封裝性,原則上這是不允許的.如果是copy修飾的NSString對象,在用NSMutableString給他賦值時,會進行深拷貝,及把內容也給拷貝了一份,兩者指向不同的位置,即使改變了NSMutableString的值,NSString的值也不會改變.所以用copy是爲了安全,防止NSMutableString賦值給NSString時,前者修改引起後者值變化而用的.

以上規則不止適用於NSString,NSArray,NSDictionary等同理

下面看一下NSSArray 和 NSDictionary 

NSSArray



關鍵字copy打印結果



關鍵字strong打印結果

NSDictionary



關鍵字strong打印結果



關鍵字copy打印結果

就寫到這也不知道理解的對不對,有人問題希望大家幫忙改正一下,本人還是個iOS小學生,希望和大家一起進步.

感謝  定義屬性時NSArray 

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