NSCoping

/**

 自定义对象要实现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;
View Code

 

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;
}
View Code

 

Student.h

#import "Person.h"

@interface Student : Person
// 学号
@property (nonatomic, copy) NSString *no;
@end
View Code

 

Student.m

@implementation Student

- (id)copyWithZone:(NSZone *)zone
{
    // 直接调用父类的copy方法
    Student *s = [super copyWithZone:zone];
    // 赋值,只需要给子类的属性赋值即可!
    s.no = self.no;
    
    // 返回
    return s;
}

@end
View Code

 

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);
    
    
}
View Code

 

posted on 2015-07-15 22:33  pTrack  阅读(231)  评论(0)    收藏  举报