Использование -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)
,