目的:自定義一個 Person 類,實現(xiàn) copy.
首先定義一個 Person 類,由于是自定義類,為了能夠支持 copy 方法,需要實現(xiàn)<NSCopying>協(xié)議
@interface Person : NSObject<NSCopying>@PRoperty (nonatomic, retain)NSString * name;@property (nonatomic, retain)NSString * sex;- (void)setName:(NSString *)name sex:(NSString *)sex;@end
<NSCopying>協(xié)議中有一個 - (id)copyWithZone:(NSZone *)zone方法,需要在 Person 的. m 文件中實現(xiàn)它.
@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]; //創(chuàng)建 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.
新聞熱點
疑難解答