copyWithZone详解

copyWithZone详解

  NSObject实现了-copy、+copy、+copyWithZone方法。代码如下:

+ (id)copy {
    return (id)self;
}

+ (id)copyWithZone:(NSZone *)zone {
    return (id)self;
}

- (id)copy {
    return [(id)self copyWithZone:NULL];
}

  其中,+copy、+copyWithZone的存在是为类对象(class obj)服务,以便让类对象能够被插入到容器中。又因为类对象全局只能存在一份,所以+copy、+copyWithZone方法只是简单返回self

  对于-copy,此方法存在的意义只是为了方便,里面会直接把-copyWithZone的方法返回。但是NSObject并没有实现-copyWithZone,需要子对象去实现NSCopying协议(即实现-copyWithZone方法)。

  最后NSZone这玩艺儿已经被Apple抛弃,所以NSObject的copy方法中只是传入NULL。

  那么,在实际开发中该如何实现-copyWithZone方法?

    1)对于祖先链上无-copyWithZone方法的情况,本类直接用 alloc来实现。

    2)对于祖先链上有-copyWithZone方法的情况,先调用[super copyWithZone],再用返回的指针对本类的独有数据进行copy。

    3)对于immutable对象,仅仅对本对象retain使得引用计数加1即可。

你可能感兴趣的:(copy)