Mam kategorię na NSObject, która ma na celu pewne rzeczy. Kiedy wywołuję to na obiekcie, chciałbym zastąpić jego metodę dealloc, aby wykonać pewne czyszczenie.Swizzling pojedynczej instancji, a nie klasy
Chciałem to zrobić za pomocą metody swizzling, ale nie mogłem dowiedzieć się, jak. Jedynymi przykładami, które znalazłem, sĘ ... to, jak zastĘ ... pić implementację metody dla całej klasy (w moim przypadku byłoby to nadpisanie dealloc dla ALL NSObjects - czego nie chcę).
Chcę zastąpić metodę dealloc konkretnych instancji obiektu 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
Dzięki za odpowiedź. Zasadniczo dla każdego połączenia przydzielam nowy obiekt (który implementuję) i ustawię go jako powiązany obiekt, a ja zajmuję się czyszczeniem wewnątrz jego dealloc? –
Dokładnie. Spójrz na ten wpis na blogu, ma nawet fajną kategorię na 'NSObject', która pozwala ci rejestrować bloki, które będą wywoływane podczas dealloc dowolnego obiektu. – Sven