這幾天看面試題,就看到這個問題,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);
下面來看下打印結果:
下面用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來修飾,如果NSMutableString的值賦值給NSString,那麼只是將NSString指向了NSMutableString的內存地址,並對NSMUtbaleString計數器加一,此時,如果對NSMutableString進行修改,也會導致NSString的值修改,person的name屬性會隨着str的改變而改變,(試想一下一個人的名字怎麼能在不知情的情況下被被改變那),破壞了封裝性,原則上這是不允許的.如果是copy修飾的NSString對象,在用NSMutableString給他賦值時,會進行深拷貝,及把內容也給拷貝了一份,兩者指向不同的位置,即使改變了NSMutableString的值,NSString的值也不會改變.所以用copy是爲了安全,防止NSMutableString賦值給NSString時,前者修改引起後者值變化而用的.
以上規則不止適用於NSString,NSArray,NSDictionary等同理
下面看一下NSSArray 和 NSDictionary
NSSArray
NSDictionary
就寫到這也不知道理解的對不對,有人問題希望大家幫忙改正一下,本人還是個iOS小學生,希望和大家一起進步.
感謝 定義屬性時NSArray