Ну, это немного проблематично, так как ваш код неверен.
- Вы не можете объявлять переменные экземпляра в категории; используя последнюю версию 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.
person
Jonathan Sterling
schedule
06.12.2010