2011年5月16日 星期一

Fundation Framework-複製物件 CH18-2 Sallow Copy and Deep Copy

//

// main.m

// CH18-2 Sallow Copy and Deep Copy

//

// Created by jason on 2011/5/16.

// Copyright 2011 __MyCompanyName__. All rights reserved.

//


//#import


#import

#import

#import

#import


int main(int argc, char *argv[])

{

NSAutoreleasePool * pool= [[NSAutoreleasePool alloc] init];

NSMutableArray *dataArray = [NSMutableArray arrayWithObjects:[NSMutableString stringWithString:@"one"],

[NSMutableString stringWithString:@"two"],

[NSMutableString stringWithString:@"three"],nil];

NSMutableArray *dataArray2;

NSMutableString *mStr;

//印出dataArray

NSLog(@"dataArray:");

for (NSString *elem in dataArray)

NSLog(@" %@",elem);

// make a copy, then change one of the strings

// 使用 mutableCopy 複製 dataArray

dataArray2 = [dataArray mutableCopy];

//mStr 指向 dataArray 第一個物件的位址

mStr= [ dataArray objectAtIndex:0];

[mStr appendString:@"ONE"]; // 將其後加上 ONE

NSLog(@"dataArray: ");

for (NSString *elem in dataArray)

NSLog(@" %@",elem); //輸出可得 => oneONE two three

NSLog(@"dataArray2: ");

for (NSString *elem in dataArray)

NSLog(@" %@",elem);

// dataArray2 輸出還是得到 => oneONE two three

// 這是因為預設為淺層複製 (shallow copy ! mutableCopy 只表示其複製時會配置新的記憶體給陣列,且獨立的元素也會被複製一份到陣列中

// 只是這些元素為參考的指標,換句話說它也還是指向某個位址的參數, 所以當 使用mStr改變dataArray內容時, dataArray2也會改變

// 所以若要複製陣列中每一個元素, 我們就要 ( deep copy ) 用來複製其內容,而不是一個參考的值(指標)

// Foundation中的 Copy mutableCopy都不會執行 deep copy! Foundation archiving 才行

// 若你要對 dictionary , set 內容加以修改的話, 我們都要建立獨立的元素副本才行

[dataArray2 release];

[pool drain];

return 0;

// return NSApplicationMain(argc, (const char **) argv);

}

沒有留言: