copy解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ldszw/article/details/50879229

1.关于copy和mutableCopy
这里写图片描述

这张图很好的解释了当源对象调用copy和mutableCopy方法时,会不会产生新对象,产生对象的类型是什么,是指针拷贝(浅拷贝)还是内容拷贝(深拷贝)!

2> 关于自定义对象调用copy方法.
当你定义了一个Dog类, .h文件中有如下属性

@property (nonatomic, assign) int age;

然后在main函数中,#import头文件
1.创建一个d1对象,并且设置age属性

        Dog *d1 = [[Dog alloc] init];
        d1.age = 10;

2.这个时候再创建一个d2,并且让d1调用copy方法赋值给d2

Dog *d2 = [d1 copy];

当我们运行程序后,会发现崩溃了,系统告诉我们:-[Dog copyWithZone:]: unrecognized selector sent to instance
说明copyWithZone这个方法找不到.所以我们可以猜测,在调用[d1 copy]这句的时候,会首先调用copyWithZone这个方法

其实在NSString的头文件里,我们可以发现NSString遵守了NSCopying协议,然后点击去发现,就有copyWithZone这个方法,而且是必须实现.于是,原因找到了!Dog需要遵守该协议,并且实现copyWithZone这个方法.

以下是解决方法:

@interface Dog : NSObject <NSCopying>

遵守NSCopying协议

- (id)copyWithZone:(NSZone *)zone
{
    Dog *d = [[Dog allocWithZone:zone] init];
    d.age = self.age;

    return d;
}

实现copyWithZone方法,并且创建Dog对象,赋值属性,然后返回出去就是一个新的Dog对象

3> @property中的copy和strong
其实两个的用处是有区别的,区别就在set方法里面,到底要不要复制
1. 当我们设置为copy时,在set方法中就会:

- (void)setName:(NSString *)name
{
    _name = [name copy];
}

2.当我们设置为copy时,在set方法中就会:

- (void)setName:(NSString *)name
{
    _name = name;
}

所以用copy还是用strong得取决于实际情况!

**比如下面这个属性就不应该用copy

@property (nonatomic, copy) NSMutableString *name;

当把一个可变字符串赋值给name时, 有人会觉得name也是一个可变字符串, 于是写上[dog.name appendString:@”xxx”], 但是因为copy属性, name就会变成不可变字符串类型, 所以这个时候程序就会崩溃,显示 “-[NSTaggedPointerString appendString:]: unrecognized selector sent to instance “, 表示name没有appendString这个方法

猜你喜欢

转载自blog.csdn.net/ldszw/article/details/50879229