/**
自定义对象要实现copy功能
1> 遵守NSCopying协议,本质上就是方便程序员编写代码时候,有快捷提示
2> 实现- (id)copyWithZone:(NSZone *)zone
*/
Person.h
#import <Foundation/Foundation.h> /** NSString Block 都使用copy属性,copy属性,在赋值时,会默认做一次copy操作,“不可变的类型” strong相当于MRC中的retain,在赋值时,只是引用计数+1 */ @interface Person : NSObject <NSCopying> @property (nonatomic, copy) NSString *name; @property (nonatomic, retain) NSMutableString *add; // *** 对于"可变类型"的属性,不要使用copy描述符定义,否则赋值后,就是不可变了! //@property (nonatomic, copy) NSMutableString *name; @property (nonatomic, assign) int age;
Person.m
#import "Person.h" /** 自定义对象要实现copy功能 1> 遵守NSCopying协议,本质上就是方便程序员编写代码时候,有快捷提示 2> 实现- (id)copyWithZone:(NSZone *)zone */ @implementation Person // zone,区域,极少用 // 所有的copy方法,最终都会调用copyWithZone // copy操作将一个对象,复制(当前对象的属性)给一个新的对象 - (id)copyWithZone:(NSZone *)zone { // 1> 实例化对象,self 是对象 // self.class能够保证继承的子类同样使用copy方法 //Person *p = [[self.class alloc] init]; Person *p = [[[self class] allocWithZone:zone] init]; // 2> 给属性赋值 p.name = self.name; p.age = self.age; // 3> 返回新对象 return p; }
Student.h
#import "Person.h" @interface Student : Person // 学号 @property (nonatomic, copy) NSString *no; @end
Student.m
@implementation Student - (id)copyWithZone:(NSZone *)zone { // 直接调用父类的copy方法 Student *s = [super copyWithZone:zone]; // 赋值,只需要给子类的属性赋值即可! s.no = self.no; // 返回 return s; } @end
void copyDemo6(); int main(int argc, const char * argv[]) { @autoreleasepool { // copyDemo5(); copyDemo6(); } return 0; } void copyDemo6() { Person *p = [[Person alloc] init]; p.name = @"zhangsan"; p.age = 18; p.add = @"wuhan"; NSLog(@"%@", p); Person *p1 = [p copy]; p1.name = @"lisi"; p.add = @"shenzhen"; NSLog(@"%@", p1); Student *s = [[Student alloc] init]; s.name = @"zhangsan"; s.age = 18; s.no = @"0001"; NSLog(@"%@, %@", s, s.no); Student *s1 = [s copy]; s1.name = @"lisi"; s1.no = @"222"; NSLog(@"%@ %@", s1, s1.no); }
浙公网安备 33010602011771号