我创建了一个符合NSCopying
和NSMutableCopying
的自定义类。
我已为-copyWithZone:
和-mutableCopyWithZone:
添加了一个实现,但每当我在我的对象上调用-mutableCopy
并尝试调用另一个方法时,它就会崩溃,因为有些ivars已经变成了即使我在ivars上调用-mutableCopyWithZone:
,也是不可变的。
以下是我复制班级的方法:
MyObject *flipped = [list mutableCopy];
[MyObject flip:flipped];
(代码在+flip:
上失败,因为它尝试在removeObjectAtIndex:
ivar上使用addObject:
和NSMutableArray
以下是我如何复制课程:
- (id)mutableCopyWithZone:(NSZone *)zone {
id instance = nil;
if ((instance = [[[self class] alloc] init])) {
[instance setArray:[self.array mutableCopyWithZone:zone]];
[instance setObjects:[self.objects mutableCopyWithZone:zone]];
[instance setItemCount:self.itemCount];
}
return instance;
}
我不确定为什么会失败,但我真的不明白为什么它不会使array
和objects
变得可变。
任何帮助表示感谢。
答案 0 :(得分:3)
我的最后一个想法:如果setArray:
和setObjects:
方法实际上是声明为@property (copy)
的属性的设置器,那么它们将复制传入的数组 - 和copy
总是返回一个不可变对象。在这种情况下,解决此问题的简便方法是将其声明为(retain)
而不是(copy)
。