あなたのコードが間違っているので、これは少し問題があります。
- カテゴリでインスタンス変数を宣言することはできません。最新の Objective-C ABI を使用すると、クラス拡張 ( ) 内で新しいインスタンス変数を宣言できます
@interface AClass () {//...
が、それはカテゴリ ( ) とは異なります@interface AClass (ACategory)
。
- できたとしても、インスタンス変数宣言の構文は、行の後に中括弧で囲むこと
@interface
です。
カテゴリでプロパティを宣言できますが、新しいインスタンス変数を使用せずに (したがって、@dynamic
代わりに@synthesize
) ストレージを定義する必要があります。
実際の質問に関しては、メソッドスウィズリングを使用しない限り、オーバーライドされたメソッドの元の実装を呼び出すことはできません (のようなランタイム関数によって促進されます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 ビット Objective-C ABI でのみ機能することに注意してください。