在自定义类上使用-mutableCopyWithZone:使其不可变

时间:2013-02-12 20:22:51

标签: objective-c cocoa class nscopying nsmutablecopying

我创建了一个符合NSCopyingNSMutableCopying的自定义类。

我已为-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;

}

我不确定为什么会失败,但我真的不明白为什么它不会使arrayobjects变得可变。

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:3)

我的最后一个想法:如果setArray:setObjects:方法实际上是声明为@property (copy)的属性的设置器,那么它们将复制传入的数组 - 和copy总是返回一个不可变对象。在这种情况下,解决此问题的简便方法是将其声明为(retain)而不是(copy)