2015-04-27 1 views
0

Мы используем Swizzling в Objective-C. Для удобства мы используем вспомогательные методы CoconutKit для достижения этой цели:Swizzling - выбор метода выбора в Objective-C iOS

HLSSwizzleSelectorWithBlock_Begin([TMObjectCache class], @selector(objectForKey:)) 
    ^(TMObjectCache *self, NSString *key) { 
     key = nil; 
     return ((id (*)(id, SEL, NSString*))_imp)(self, _cmd, key); 

    } 
HLSSwizzleSelectorWithBlock_End; 

Мы хотели бы, однако, также не-надираться этот метод после того, как какой-то момент в коде. Есть ли способ сделать это?

ответ

2

Я не знаком с CoconutKit, но swizzling - это просто звонок по номеру method_exchangeImplementations(). Эта функция заменяет две реализации. Поэтому, если вы снова назовете его с теми же параметрами, вы замените реализацию обратно. Вам нужно посмотреть, как HLSSwizzleSelectorWithBlock_Begin строит свой звонок до method_exchangeImplementations() и делает это снова.

И, конечно же, вставьте все стандартные предупреждения о том, что swizzling является невероятно опасным, хрупким, в первую очередь полезным для отладки, и его следует избегать в производственном коде, если есть какое-либо другое решение.

+0

«swizzling невероятно опасен, хрупок, в первую очередь полезен для отладки, и его следует избегать в производственном коде». За исключением того, что Cocoa wlll счастливо сделает это за вас за спиной. :( – matt

+1

Да, но люди, которые делали KVO, имели доступ к исходному коду, и все разработчики Apple знают, что не сломать KVO. У них нет такого же беспокойства по поводу ваших swizzles. (Конечно, KVO isa-swizzling, не метод-swizzling. Знаете ли вы, что применяемый Apple метод - swizzle, который я забываю?) –

+0

Я думаю, что KVO был главным, что я имел в виду, как вы говорите, это не метод swizzling, но я все еще считаю с подозрением (хотя я вынужден его использовать). – matt

Смежные вопросы