2014-09-29 71 views
0

我正在研究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 

任何幫助或建議將不勝感激。

回答

0

我相信你看到NSString的不變性。 This answer記錄了在堆棧上分配時具有相同地址的兩個單獨的NSString對象的示例。我會假設copyretain只是返回self爲不可變的值,因爲他們永遠不會改變。

+0

我很困惑爲什麼'bString'沒有新的內存地址。 – 2014-09-29 11:48:56

+0

由於'NSString'是不可變的 - 它永遠不會改變。不需要分配一個新對象來表示同一個不可變對象。在一個完美的實現中,只有一個'NSString'的實例具有''Hello World!「'的值。每當運行時檢測到一個'NSString'時,它就可以使用該值的唯一實例。然而,在現實世界中,'NSString'實現總是可以從'retain'和'copy'中返回'self',這就是你在這裏看到的。 – 2014-09-30 01:11:50

0

copy並不一定會給你一個新的對象。一個不可變類可以選擇通過給你相同的對象來實現它,保留。你不應該在乎它是否是同一個對象。