int main(int argc, const char * argv[]) { @autoreleasepool { //------------------不可變的對象------------------- //建立一個字符串型a NSString *a = @"abcdefg"; //淺拷貝a,只是引用了一下,打印出來地址是同樣的 //這裏若是把淺拷貝出來的a1的值改變了,源a是不會跟着變的,a1會自動生成一個新的對象,和a是不一樣的地址 NSString *a1 = [a copy]; //深拷貝a,直接克隆了一下,打印出來是不一樣的地址 NSString *a2 = [a mutableCopy]; //打印a,a1,a2的值,比較一下 NSLog(@"%@ %@ %@", a, a1, a2); //打印a,a1,a2的地址,比較一下 NSLog(@"%p %p %p", a, a1, a2); //------------------可變的對象--------------------- NSMutableString *b = [NSMutableString stringWithString:@"abcdefg"]; //對可變對象不管是淺拷貝仍是深拷貝,都是直接克隆了對象出來,都是不一樣的地址 NSMutableString *b1 = [b copy]; NSMutableString *b2 = [b mutableCopy]; NSLog(@"%@ %@ %@", b, b1, b2); NSLog(@"%p %p %p", b, b1, b2); } return 0; }
對一不可變對象複製,copy是指針複製(淺拷貝)和mutableCopy就是對象複製(深拷貝)。spa
若是是對可變對象複製,都是深拷貝,可是copy返回的對象是不可變的。指針
能夠使用copy的類:code
NSNumber,對象
NSString,字符串
NSMutableString,string
NSDictionary,it
NSMutableDictionary,io
NSArray,table
NSMutableArray,class
NSSet,
NSMutableSet