copy

来源:互联网 发布:黄冈名师软件下载 编辑:程序博客网 时间:2024/09/21 08:57

今天遇到一个实际操作。终于把这个copy了解得更加透彻了(用得太少咯)


自定义了一个LBObject类,这样用:

    _weakObjectC = [[LBObject alloc] init];    _weakObjectC.name = @"luxiangting";        _weakObjectD = [_weakObjectC copy];

编译器马上罢工了。告诉你不能这样做。因为找不到方法,这个好搞,马上遵守协议,并且实现方法:

#pragma mark - LBObject@interface LBObject : NSObject <NSCopying , NSMutableCopying>@property (nonatomic, strong) NSString *name;@property (nonatomic, assign) NSInteger age;@end

然后这样搞一搞,无痛无伤,爽歪歪

#pragma mark - LBObject@implementation LBObject- (id)copyWithZone:(NSZone *)zone{    LBObject *object = [[[self class] allocWithZone:zone] init];        object.name = [_name copy];    object.age = _age;        return object;}- (id)mutableCopyWithZone:(NSZone *)zone{        LBObject *object = [[[self class] allocWithZone:zone] init];        object.name = [_name mutableCopy];    object.age = _age;        return object;}@end


然后发现一个很好的问题,mutableArray踩坑,且看:

https://segmentfault.com/q/1010000004359262?_ea=606650

http://stackoverflow.com/questions/14856681/why-does-a-copy-nonatomic-nsmutablearray-property-create-nsarrays


从这里学到的几点,太重要!

属性变量说白了就是编译器帮你自动生成get set点语法
所以一切属性的点语法赋值可以是变相set方法,例如:

self.words = mutWords;
其实就是:

[self setWords:mutWords];

这个时候就需要qualifier修饰词来修饰内存的设置了,例如如果你设置成copy:
其实就是将set方法重写为:

- (void)setWords:(NSMutableArray *)newWords{    _words = [newWords copy];}

也许你就明白了strong的作用了,strong相当于MRC的retain,就是直接的引用计数的增一
回到上面,如果在copy的修饰下,还是self.words = mutWords;这样
其实就是:
self.words = [mutWords copy];  // 代入set方法嘛


而copy和mutableCopy最大的区别就是生成的拷贝对象是否可变。
如果对mutableArray进行copy操作,完蛋了,生成一个不可变的NSArray对象,坑就来啦!

这样去理解这四个修饰词:copy retain weak strong 就会明白很多很多!

0 0