我正在研究Objective-c中「複製」和「保留」的不同之處。但是,我有些懷疑,爲什麼'copy'方法不能打開一個新的內存地址?關於「複製」和「保留」的詳細信息
NSString *aString = [NSString stringWithFormat:@"Hello, World !"];
NSLog(@"%p, %@", aString, aString);
NSString *bString = [aString copy];
NSLog(@"%p, %@", bString, bString);
NSString *cString = [aString retain];
NSLog(@"%p, %@", cString, cString);
[aString release];
[bString release];
[cString release];
結果如下圖所示:
2014-09-29 17:30:52.730 SEL_Demo[987:303] 0x100301030, Hello, World !
2014-09-29 17:30:52.731 SEL_Demo[987:303] 0x100301030, Hello, World !
2014-09-29 17:30:52.731 SEL_Demo[987:303] 0x100301030, Hello, World !
不過,我創建了一個名爲Person的新類,並實現了與此委託:
- (id) copyWithZone:(NSZone *)zone
{
return [[[self class] allocWithZone:zone] init];
}
然後,在主文件:
Person *person = [[Person alloc] init];
NSLog(@"%p",person);
Person *aPerson = [person copy];
NSLog(@"%p", aPerson);
Person *bPerson = [person retain];
NSLog(@"%p", bPerson);
那麼,我得到噸他不同的結果如下所示:
2014-09-29 19:02:50.248 SEL_Demo[1133:303] 0x10010a860
2014-09-29 19:02:50.250 SEL_Demo[1133:303] 0x1003007f0 //different memory address.
2014-09-29 19:02:50.250 SEL_Demo[1133:303] 0x10010a860
任何幫助或建議將不勝感激。
我很困惑爲什麼'bString'沒有新的內存地址。 – 2014-09-29 11:48:56
由於'NSString'是不可變的 - 它永遠不會改變。不需要分配一個新對象來表示同一個不可變對象。在一個完美的實現中,只有一個'NSString'的實例具有''Hello World!「'的值。每當運行時檢測到一個'NSString'時,它就可以使用該值的唯一實例。然而,在現實世界中,'NSString'實現總是可以從'retain'和'copy'中返回'self',這就是你在這裏看到的。 – 2014-09-30 01:11:50