Ну, это немного проблематично, поскольку ваш код неверен.
- Вы не можете объявить переменные экземпляра в категории;используя последний Objective C ABI, вы можете объявить новые переменные экземпляра в расширении класса (
@interface AClass () {//...
), но это отличается от категории (@interface AClass (ACategory)
). - Даже если вы могли бы, синтаксисНапример, объявление переменной заключается в том, что они заключены в фигурные скобки после строки
@interface
.
Вы можете объявить свойство в категории, но вам придется определить его хранилище без использования новогопеременная экземпляра (следовательно, @dynamic
вместо @synthesize
).
Что касается вашего фактического вопроса, вы не можете вызвать исходную реализацию переопределенного метода, если не используете метод swizzling (облегченный)по времени выполнения функций, таких как method_exchangeImplementations
).Я рекомендую не делать этого в любом случае;это действительно пугающе и опасно.
Обновление: Объяснение переменных экземпляра в расширениях класса
Расширение класса похоже на категорию, но оно анонимно и должно быть помещено в .m
файл, связанный с исходным классом.Это выглядит так:
@interface SomeClass () {
// any extra instance variables you wish to add
}
@property (nonatomic, copy) NSString *aProperty;
@end
Его реализация должна находиться в главном блоке @implementation
для вашего класса.Таким образом:
@implementation SomeClass
// synthesize any properties from the original interface
@synthesize aProperty;
// this will synthesize an instance variable and accessors for aProperty,
// which was declared in the class extension.
- (void)dealloc {
[aProperty release];
// perform other memory management
[super dealloc];
}
@end
Итак, расширение класса полезно для хранения закрытых переменных экземпляра и методов вне открытого интерфейса, но не поможет вам добавить переменные экземпляра в класс, который вы не контролируете.Нет проблем с переопределением -dealloc
, потому что вы просто реализуете его, как обычно, в то же время включая все необходимое управление памятью для переменных экземпляра, которые вы ввели в расширение класса.
Пожалуйстаобратите внимание, что этот материал работает только с последним 64-битным ABI Objective-C.