標籤:
淺複製:複製對象時,如果對象中包含物件類型的執行個體變數,只是複製指標。新對象中的物件類型執行個體變數和舊對象中的物件類型執行個體變數指的是同一個對象。任何一方執行個體變數對對象做修改,另一方執行個體變數指向的該對象也就改變了。
.h聲明檔案
1 // Person.h 2 // 03-對象複製 3 // 4 // Created by ma c on 15/8/14. 5 // Copyright (c) 2015年 bjsxt. All rights reserved. 6 // 7 8 #import <Foundation/Foundation.h> 9 10 @interface Person : NSObject<NSCopying>//實現NSCopying協議才能支援自訂對象的複製
11 @property(nonatomic,retain)NSMutableString *name;//(retain)淺拷貝,拷貝對象的引用,其實用的還是一個對象,相當於一個人給自己起了一個別名
12 @property(nonatomic,assign)NSInteger age;13 -(id)initWithName:(NSMutableString*)name andAge:(NSInteger)age;14 -(void)show;15 @end
.m實現檔案
1 // Person.m 2 // 03-對象複製 3 // 4 // Created by ma c on 15/8/14. 5 // Copyright (c) 2015年 bjsxt. All rights reserved. 6 // 7 8 #import "Person.h" 9 10 @implementation Person11 -(id)initWithName:(NSMutableString*)name andAge:(NSInteger)age12 {13 self = [super init];14 if(self)15 {16 _name = [name retain];//強引用,獲得對象所有權17 _age = age;18 }19 return self;20 }21 -(void)show22 {23 NSLog(@"name:%@,age:%lu",_name,_age);24 }25 -(void)dealloc26 {27 [_name release];28 [super dealloc];29 }30 -(id)copyWithZone:(NSZone *)zone31 {32 return [[Person alloc]initWithName:_name andAge:_age];33 }34 @end
main.m主函數
1 // main.m 2 // 03-對象複製 3 // 4 // Created by ma c on 15/8/14. 5 // Copyright (c) 2015年 bjsxt. All rights reserved. 6 // 7 8 #import <Foundation/Foundation.h> 9 #import "Person.h"10 int main(int argc, const char * argv[]) {11 @autoreleasepool {12 // 測試Person類13 NSMutableString *name = [NSMutableString stringWithString:@"Tom"];14 15 Person *p1 = [[Person alloc]initWithName:name andAge:20];16 [p1 show];17 18 [name appendString:@"Jerry"];19 20 Person *p2 = [[Person alloc]initWithName:name andAge:21];21 [p2 show];22 23 [p1 show];24 25 //對象複製,自訂對象必須要實現NSCopying協議才能支援對象複製26 Person *p3 = [p1 copy];27 [p3 show];28 29 [p1.name appendString:@"123"];//因為retain,p1和p2指向同一對象,一改都改30 [p3 show];31 32 NSMutableString *name2 = [NSMutableString stringWithString:@"Jobs"];33 [p1 setName:name2];//p1和p3指向的是不同的對象,互不影響34 [p3 show];35 36 [p1 release];37 [p2 release];38 [p3 release];39 }40 return 0;41 }
測試結果如下:
2015-08-14 16:40:59.293 03-對象複製[1460:96685] name:Tom,age:20 2015-08-14 16:40:59.294 03-對象複製[1460:96685] name:TomJerry,age:212015-08-14 16:40:59.294 03-對象複製[1460:96685] name:TomJerry,age:202015-08-14 16:40:59.295 03-對象複製[1460:96685] name:TomJerry,age:202015-08-14 16:40:59.295 03-對象複製[1460:96685] name:TomJerry123,age:202015-08-14 16:40:59.295 03-對象複製[1460:96685] name:TomJerry123,age:20Program ended with exit code: 0
Objective-C:淺複製(拷貝)