2013-02-12 2 views
1

Я создал собственный класс, который соответствует NSCopying и NSMutableCopying.Использование -mutableCopyWithZone: на пользовательский класс делает его неизменным

Я добавил реализацию для -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

«код не работает на + flip :, потому что он пытается использовать removeObjectAtIndex: и addObject: на NSMutableArray ivar» - это действительно «NSMutableArray»? – 2013-02-12 20:24:47

+0

У вас есть свойства массива или объектов, объявленные как 'copy'? –

+0

Это не NSMutableArray во время выполнения, это __NSArrayI, но в коде он определен как NSMutableArray. –

ответ

3

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

+2

Учитывая, что это находится внутри 'copy', я предлагаю установить ivars нового экземпляра напрямую, а не использовать set accessor. –

+0

@StevenFisher Проблема заключается в следующем: изменяемые объекты не должны использоваться как свойства. – 2013-02-12 20:51:03

+0

Согласовано. Я сделал предположение, вероятно, необоснованным, что свойства использовались здесь только для целей управления памятью. –