2011-03-29 54 views
0

我對目標C中複製對象的工作方式有點困惑。下面是我所知道的:當你複製一個對象時,你會在內存中得到一個獨立的對象,它包含所有相同的元素從您剛剛複製的對象中獲取並增加每個元素的保留計數。此外,將數組對象中的每個元素從原始位置複製到新位置意味着只需將該引用從數組的一個元素複製到另一個元素。所以,舊的和新的都指向相同的元素。對象複製如何工作在目標c

看看下面的代碼:爲什麼當你刪除一個對象時,它只會影響一個對象,當你改變這個元素時,它會同時影響原始對象和複製對象?刪除不應該影響兩個對象嗎?

NSMutableArray *dataArray = [NSMutableArray arrayWithObjects: 
          [NSMutableString stringWithString:@"one"], 
          [NSMutableString stringWithString:@"two"], 
          [NSMutableString stringWithString:@"three"], nil]; 
NSMutableArray *dataArray2; 
NSMutableString *mStr; 

NSLog(@"1-dataArray: "); 
for(NSString *elem in dataArray) 
    NSLog(@" %@", elem); 

dataArray2 = [dataArray mutableCopy]; 
[dataArray2 removeObjectAtIndex:0]; 

NSLog(@"2-dataArray2: "); 
for(NSString *elem in dataArray2) 
    NSLog(@" %@", elem); 

mStr =[dataArray objectAtIndex:1]; 
[mStr appendString:@"ONE"]; 



NSLog(@"3-dataArray: "); 
for(NSString *elem in dataArray) 
    NSLog(@" %@", elem); 


NSLog(@"4-dataArray2: "); 
for(NSString *elem in dataArray2) 
    NSLog(@" %@", elem); 

[dataArray2 release]; 

回答

1

mutableCopy執行NSArray內容的「淺拷貝」。例如。它正在複製原始數組中的指針(並且可能保留它們)。它不會複製那些指針指向的數據。

如果我們明確地做到這一點本質上是這樣做的:

-(NSMutableArray*)mutableCopy 
{ 
    NSMutableArray *newArray = [[NSMutableArray alloc] init]; 
    for (id elem in originalArray) 
     [newArray addObject: elem]; 
    return newArray; 
} 

雖然可能它更有效地做它通過使用內部數據結構的訪問。

+0

您可能想閱讀[內存管理編程指南的複製部分](http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmImplementCopy.html#// apple_ref/doc/uid/20000049-BBCEBJCH)以便了解有關淺拷貝與深拷貝的更多信息。 – Kyone 2011-03-29 15:57:36

+0

我會更深入地看待它。 – Freeme 2011-03-30 18:09:11