copy和mutable copy都是我以前没有深究的东西,两个东西分别实现了nscopying和nsmutablecopying协议。
这4个协议,后面两个会在后面讲到。
但运行到arrb remove的时候直接crash掉了,就直接说明了这个问题。
这里copy有点问题,mutable copy很完美实现。
@protocol NSCopying
- (id)copyWithZone:(NSZone *)zone;
@end
@protocol NSMutableCopying
- (id)mutableCopyWithZone:(NSZone *)zone;
@end
协议非常简单,一般我们调用系统的nsarray,nsdictionary等等都已经实现了这两个协议。
<NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration>
这4个协议,后面两个会在后面讲到。
copy是生成对象的副本,但是对象不可变的
mutablecopy生成对象的副本,但是是可变的
这就是区别
我们来看下下面这个例子:
NSMutableArray * arr = [[NSMutableArray alloc] initWithObjects:@"aaa",@"bbb",@"ccc", nil];
NSMutableArray * arrA = [arr mutableCopy];
NSMutableArray * arrB = [arr copy];
[arr removeObject:@"aaa"];
[arrA removeObject:@"bbb"];
[arrB removeObject:@"ccc"];
但运行到arrb remove的时候直接crash掉了,就直接说明了这个问题。
但是由于是可变数组,你可能不太了解,我们自己实现一个类,来说明问题。
@interface Person : NSObject<NSCopying,NSMutableCopying>
{
@public
NSInteger age;
}
//@property(nonatomic , assign)NSInteger age;
@end
- (id)copyWithZone:(NSZone *)zone
{
Person * person = [[Person alloc] init];
person->age = self->age;
return person;
}
- (id)mutableCopyWithZone:(NSZone *)zone
{
Person * person = [[Person alloc] init];
person->age = self->age;
return person;
}
- (void)dealloc{
[super dealloc];
}
这里copy有点问题,mutable copy很完美实现。