Skip to content

copy 与mutablecopy 概念

miaohy edited this page Dec 8, 2020 · 2 revisions

以前总是费很多时间去记忆这两个概念,现在梳理一下具体实现。
1、首先只有遵循了NSCopying,NSMutableCopying 协议的类才能实现copy
@interface ProtocolLearning : NSObject<ProtocolLearningProtocol,NSCopying>

2、然后类中实现这个协议,看执行copy后到底有没有真的copy出来一份内存,要看这个copyWithZone是怎么实现的,返回self的话就没有再copy出来一份内存了,返回一个新对象的话就alloc出来一个新内存了
- (id)copyWithZone:(nullable NSZone *)zone{ return self; }

3、NSObject中方法调用情况
//类copy的话返回自己,没有重新copy出来新对象,类似于直接赋值
+(id)copy { return (id)self; }

//类copy的话返回自己,没有重新copy出来新对象,类似于直接赋值
+(id)copyWithZone:(struct _NSZone *)zone { return (id)self; }

//实例对象copy的话要看具体类里面copyWithZone是怎么实现的,要是具体类里面没有实现copyWithZone方法,执行copy会报找不到方法错误unrecognized selector sent to instance -(id)copy { return [(id)self copyWithZone:nil]; }

////类mutableCopy的话返回自己,没有重新copy出来新对象,类似于直接赋值 +(id)mutableCopy { return (id)self; }

////类mutableCopyWithZone的话返回自己,没有重新copy出来新对象,类似于直接赋值 +(id)mutableCopyWithZone:(struct _NSZone *)zone { return (id)self; }

//////实例对象mutableCopy的话要看具体类里面copyWithZone是怎么实现的,要是具体类里面没有实现copyWithZone方法,执行mutableCopy会报找不到方法错误unrecognized selector sent to instance
-(id)mutableCopy { return [(id)self mutableCopyWithZone:nil]; }

Clone this wiki locally