自訂類實現<NSCopying>協議,自訂nscopying
目的:自訂一個 Person 類,實現 copy.
首先定義一個 Person 類,由於是自訂類,為了能夠支援 copy 方法,需要實現<NSCopying>協議
@interface Person : NSObject<NSCopying>@property (nonatomic, retain)NSString * name;@property (nonatomic, retain)NSString * sex;- (void)setName:(NSString *)name sex:(NSString *)sex;@end
<NSCopying>協議中有一個 - (id)copyWithZone:(NSZone *)zone方法,需要在 Person 的. m 檔案中實現它.
@implementation Person- (id)copyWithZone:(NSZone *)zone{ id p = [[[self class] allocWithZone:zone] init];<span style="white-space:pre"> //考慮到 Person 可能會有子類,這裡用 id 表示類型 [p setName:_name sex:_sex]; //設定複製對象的執行個體變數,否則預設拷貝的對象的執行個體變數值為空白 return p;}- (void)setName:(NSString *)name sex:(NSString *)sex{ _name = name; _sex = sex;}@end
在main.m 檔案中進行測試
Person * p1 = [[Person alloc] init]; //建立 p1 對象 [p1 setName:@"張三" sex:@"男"]; //為 p1 執行個體變數賦值 Person * p2 = [p1 copy]; //從 p1 拷貝一個新對象 p2 NSLog(@"p2.name = %@, p2.sex = %@", p2.name, p2.sex); //列印 p2 的 name 和 sex p2.name = @"李四"; //更改 p2 的 name NSLog(@"p2.name = %@", p2.name); NSLog(@"p1.name = %@", p1.name); //再次列印 p1 的 name,驗證 p1 的 name 是否改變
下面是列印結果:
2015-01-21 21:27:59.466 CopyTest[2053:303] p2.name = 張三, p2.sex = 男2015-01-21 21:27:59.468 CopyTest[2053:303] p2.name = 李四2015-01-21 21:27:59.468 CopyTest[2053:303] p1.name = 張三
可以看出,改變 p2 的 name, 並沒有影響 p1 的name.