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?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容