zoukankan      html  css  js  c++  java
  • oc83--自定义类实现copy方法

    //
    //  main.m
    //  自定义类实现copy
    
    #import <Foundation/Foundation.h>
    #import "Person.h"
    #import "Student.h"
    
    int main(int argc, const char * argv[]) {
        /*
         1.以后想让自定义的对象能够被copy只需要遵守NSCopying协议
         2.实现协议中的- (id)copyWithZone:(NSZone *)zone
         3.在- (id)copyWithZone:(NSZone *)zone方法中创建一个副本对象, 然后将当前对象的值赋值给副本对象即可
         */
        Person *p = [[Person alloc] init];
        p.age =  30;
        p.name = @"lnj";
        NSLog(@"%@", p);
        Person *p22 = [p copy];//p没有copy方法,
        Person *p2 = [p mutableCopy];
        NSLog(@"%@", p2);//name= lnj, age = 30
        NSLog(@"%@", p22);//name = lnj, age = 30
        p.age = 100;
        p.name = @"ssss";
        NSLog(@"%@", p2);//name= lnj, age = 30
        NSLog(@"%@", p22);//name = lnj, age = 30
        
        
        
        Student *stu = [[Student alloc] init];
        stu.age = 30;
        stu.height = 1.75;
        stu.name = @"lnj";
        NSLog(@"stu = %@", stu);
        // 如果想让子类在copy的时候保留子类的属性, 那么必须重写copyWithZone方法, 在该方法中先调用父类创建副本设置值, 然后再设置子类特有的值
        Student *stu2 = [stu copy];
        NSLog(@"stu2 = %@", stu2);
        
        return 0;
    }
    //
    //  Person.h
    
    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject<NSCopying, NSMutableCopying>  //才有copy方法,
    
    @property (nonatomic, assign) int age;
    
    @property (nonatomic, copy) NSString *name;
    @end
    //
    //  Person.m
    
    
    #import "Person.h"
    
    @implementation Person
    
    
    - (id)copyWithZone:(NSZone *)zone  //拷贝一个副本
    {
        // 1.创建一个新的对象
        Person *p = [[[self class] allocWithZone:zone] init];  //class方法,获取这个对象对应的类。
        // 2.设置当前对象的内容给新的对象,拷贝的对象和原来对象的内容要一样,
        p.age = _age;
        p.name = _name;
        // 3.返回新的对象
        return p;
    }
    - (id)mutableCopyWithZone:(NSZone *)zone
    {
        // 1.创建一个新的对象
        Person *p = [[[self class] allocWithZone:zone] init];
        // 2.设置当前对象的内容给新的对象
        p.age = _age;
        p.name = _name;
        // 3.返回新的对象
        return p;
    }
    
    - (NSString *)description
    {
        return [NSString stringWithFormat:@"name = %@, age = %i", _name, _age];
    }
    @end
    //
    //  Student.h
    //
    
    #import "Person.h"
    
    @interface Student : Person  //子类继承父类,会继承父类的协议。
    
    @property (nonatomic, assign) double height;
    @end
    //
    //  Student.m
    
    #import "Student.h"
    
    @implementation Student
    
    - (id)copyWithZone:(NSZone *)zone
    {
        // 1.创建副本
        // id obj = [[self class] allocWithZone:zone];
        id obj = [super copyWithZone:zone];
        // 2.设置数据给副本
    //    [obj setAge:[self age]];
    //    [obj setName:[self name]];
        [obj setHeight:_height];
        
        // 3.返回副本
        return obj;
    }
    
    - (NSString *)description
    {
        return [NSString stringWithFormat:@"name = %@, age = %i, height = %f", [self name], [self age], _height];
    }
    
    @end
  • 相关阅读:
    poj 2155 Matrix
    iOS之Prefix.pch
    多用派发队列,少用同步锁
    SenTestingKit.framework的报错!
    xcode4的环境变量,Build Settings参数,workspace及联编设置
    xcode4中build Settings常见参数解析
    XCode环境变量及路径设置
    Xcode添加静态库以及编译选项配置常见问题
    基于第三方微信授权登录的iOS代码分析
    理解iOS 8中的Self Sizing Cells和Dynamic Type
  • 原文地址:https://www.cnblogs.com/yaowen/p/7443508.html
Copyright © 2011-2022 走看看