//
// 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);
}
沒有留言:
張貼留言