Уточнение: вопрос не о изменчивом и неизменяемом, а о вызове super, создающем экземпляр правильного класса. Я не думал использовать [[self class] alloc]
в базовом классе, и это, похоже, решает мои проблемы. Я принимаю, что AnSer в ближайшие несколько часов, если ничего лучше не приходит :)mutableCopyWithZone непонятное требование?
If a subclass inherits NSMutableCopying from its superclass and declares
additional instance variables, the subclass has to override mutableCopyWithZone:
to properly handle its own instance variables, invoking the superclass’s
implementation first.
Это очень сбивает с толку. Рассмотрите
@interface Base : NSObject<NSMutableCopying>
@property (nonatomic, assign) NSInteger value ;
@end
@implementation Base
...
@end
@interface Derived : Base<NSMutableCopying>
@property (nonatomic, assign) NSInteger value2 ;
@end
@implementation Derived
- (id) mutableCopyWithZone: (NSZone *) zone {
// Huh ???
Derived * derived = [super mutableCopyWithZone: zone] ;
...
// Huh ??????
derived.value2 = self.value2 ;
return derived ;
}
...
@end
Я просто не понимаю, как этот код может быть прав, если я следую спецификации.
Когда звонок в [super mutableCopyWithZone: zone]
возвращается, я ожидаю, что базовый класс выделил достаточно места для своих собственных иваров. Нельзя сказать, что экземпляры Derived
нуждаются в большем количестве для своих собственных иваров.
В чем заключается документация? Как мне это реализовать?
В соответствии с документацией только классы, которые определяют различие «неизменяемого и изменяемого», должны принимать протокол NSMutableCopying. У вас есть как «Derived», так и «MutableDerived»? –
Я думаю, что Derived - это изменяемый класс, а base - неизменный класс. –
Если Base был непреложным классом, тогда он не принял протокол NSMutableCopying. –