• 自定义类与NSCopying协议


    代码:

    @import Foundation;
    
    /****************************************
     * Person类
     ****************************************/
    @interface Person : NSObject <NSCopying>
    
    // 姓名属性
    @property (copy, nonatomic) NSString *name;
    
    @end
    
    @implementation Person
    
    - (id)copyWithZone:(NSZone *)zone {
        // 通过使用self.class,allocWithZone:消息将会被发送给正在接受copy消息的实例所属的类
        // 这个类可能是copyWithZone:消息所在类的子类,通过这种方式可以正确的创建想要的实例
        // 如果不使用self.class,而使用具体的类名,可能导致创建得到的实例无法返回给类型正确的实例指针
        // allocWithZone:方法是一个类方法,其返回新创建的实例
        // zone是NSZone结构体的一个指针,用与标示和管理内存区域
        Person* personCopy = [[self.class allocWithZone:zone] init];
        
        // 复制实例变量或属性
        personCopy.name = self.name;
        
        // 返回实例
        return personCopy;
    }
    
    @end
    
    /****************************************
     * GoodPerson类 : Person类
     ****************************************/
    @interface GoodPerson : Person
    
    // 年龄属性
    @property (assign, nonatomic) NSUInteger age;
    
    @end
    
    @implementation GoodPerson
    
    - (id)copyWithZone:(NSZone *)zone {
        // 由于父类已经实现了copyWithZone:方法,子类只需调用该方法,并完成自己的属性的复制工作即可
        GoodPerson *goodPersonCopy = [super copyWithZone:zone];
        
        // 复制子类实例的变量或属性
        goodPersonCopy.age = self.age;
        
        // 返回实例
        return goodPersonCopy;
    }
    
    @end
    
    /****************************************
     * main函数
     ****************************************/
    int main(int argc, const char * argv[]) {
        GoodPerson *gp1 = [[GoodPerson alloc] init];
        gp1.name = @"BBB";
        gp1.age = 40;
        
        GoodPerson *gp2 = [gp1 copy];
        gp2.name = @"CCC";
        gp2.age = 50;
        
        NSLog(@"gp1 = %@", gp1);
        NSLog(@"gp2 = %@", gp2);
        
        return 0;
    }
  • 相关阅读:
    在 Borland C++ 及 Visual C++ 环境中使用 STLport (作者:孟岩)
    设置JavaFX-CSS改变TreeView节点图标
    Using MS DataGrid control with ADO
    两个加载fxml文件的方法
    JavaFX中ObservableValue类型
    在 Eclipse 下利用 gradle 构建系统
    JavaFX初探
    深度剖析如何保证缓存与数据库的一致性
    ACID的实现原理
    一颗高度为3的B+树能存多少行数据?
  • 原文地址:https://www.cnblogs.com/xwoder/p/4477170.html
Copyright © 2020-2023  润新知