私は NSObject のカテゴリを持っています。オブジェクトでそれを呼び出すとき、その dealloc メソッドをオーバーライドしてクリーンアップを行いたいと考えています。
メソッドスウィズリングを使用してやりたかったのですが、方法がわかりませんでした。私が見つけた唯一の例は、クラス全体のメソッド実装を置き換える方法に関するものです (私の場合、すべての NSObject の dealloc をオーバーライドしますが、これは望ましくありません)。
NSObject の特定のインスタンスの dealloc メソッドをオーバーライドしたいと考えています。
@interface NSObject(MyCategory)
-(void)test;
@end
@implementation NSObject(MyCategory)
-(void)newDealloc
{
// do some cleanup here
[self dealloc]; // call actual dealloc method
}
-(void)test
{
IMP orig=[self methodForSelector:@selector(dealloc)];
IMP repl=[self methodForSelector:@selector(newDealloc)];
if (...) // 'test' might be called several times, this replacement should happen only on the first call
{
method_exchangeImplementations(..., ...);
}
}
@end