Swizzling для одного экземпляра, а не для класса

У меня есть категория NSObject, в которой должны быть такие вещи. Когда я вызываю его для объекта, я хотел бы переопределить его метод dealloc, чтобы выполнить некоторую очистку.

Я хотел сделать это методом swizzling, но не мог понять, как это сделать. Единственные примеры, которые я нашел, - это то, как заменить реализацию метода для всего класса (в моем случае это переопределило бы dealloc для ВСЕХ NSObjects, чего я не хочу).

Я хочу переопределить метод dealloc для определенных экземпляров NSObject.

@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
17
задан Gilad Novik 29 February 2012 в 18:06
поделиться