Objective-C深复制和<NSCopying>

作者: linc_ | 来源:发表于2016-02-02 10:09 被阅读320次
    1. 简单复制只能实现浅拷贝:指针赋值,使两个指针指向相同的一块内存空间,操作不安全。
    2. Foundation类已经遵守了<NSCopying><NSMutableCopying>协议,即实现了copy和mutableCopy方法,因此Foundation对象可以使用这些方法创建对象的副本或可变副本
    @protocol NSCopying
    - (id)copyWithZone:(NSZone *)zone;
    @end
    
    @protocol NSMutableCopying
    - (id)mutableCopyWithZone:(NSZone *)zone;
    @end
    

    3.用户自定义类遵守<NSCopying>协议和<NSMutableCopying>协议,则必须实现copyWithZone方法和mutableCopyWithZone方法,否则该类对象无法响应copy和mutableCopy消息
    4.实现copyWithZone方法,例:

    -(id)copyWithZone:(NSZone *)zone
    {
        Student *stu = [[Student allocWithZone:zone]initWithName:self.name Age:self.age];
        return stu;
    }
    

    对应main函数中:假设已经有一个Student对象stu1;
    则:Student stu2 = [stu1 copy];
    实现stu2是stu1的副本,这里是深复制,stu1和stu2分别对应不同内存。

    5.如果你的类产生了子类,那么copyWithZone:方法也将
    被继承

    Student *stu = [[Student allocWithZone: zone] init];
    

    该方法应该改为:

    Student *stu = [[[self class] allocWithZone: zone]init];
    

    如果编写一个类的copyWithZone:方法那么子类的方法应该先调用父类的copy方法以复制继承来的copy实例变量.

    相关文章

      网友评论

        本文标题:Objective-C深复制和<NSCopying>

        本文链接:https://www.haomeiwen.com/subject/wtnskttx.html