Использование -mutableCopyWithZone: в пользовательском классе делает его неизменным

Я создал собственный класс, который соответствует NSCopying а также NSMutableCopying,

Я добавил реализацию для -copyWithZone: а также -mutableCopyWithZone:, но всякий раз, когда я звоню -mutableCopy на моем объекте и попытаться вызвать другой метод, он падает, потому что некоторые из иваров стали неизменными, хотя я вызываю -mutableCopyWithZone: на иваре.

Вот как я копирую свой класс:

MyObject *flipped = [list mutableCopy];
[MyObject flip:flipped];

(код не работает на +flip:потому что он пытается использовать removeObjectAtIndex: а также 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 изменчивый.

Любая помощь приветствуется.

1 ответ

Решение

Моя последняя идея: если setArray: а также setObjects: методы фактически являются установщиками для свойств, объявленных как @property (copy)затем они скопируют переданные массивы - и copy всегда возвращает неизменный объект. В этом случае простым способом исправить это было бы объявить их (retain) вместо (copy),

Другие вопросы по тегам