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这个方法