Переопределение / Swizzling методы из существующего общего делегата - PullRequest
1 голос
/ 10 августа 2009

Можно ли переопределить ТОЛЬКО НЕКОТОРЫЕ функции от существующего делегата, не будучи полностью делегатом?

Я пытался заменить целевой IMP на мой, не получилось: '(

Подробнее:


+[SomeClass sharedDelegate]

-[sharedDelegate targetMethodToBeOverridden:Arg:] //OUR method needs to be called, not this

Method *targetMethod;  // targetMethodToBeOverridden identified by class_copymethodlist magic

targetMethod->method_imp =  [self methodForSelector:@selector(overriddenDelegateMethod:Arg:)];

НЕ РАБОТАЕТ! Мой метод не вызывается: (

1 Ответ

3 голосов
/ 10 августа 2009

Вы, вероятно, не должны манипулировать структурой Method напрямую. Вместо этого используйте функцию времени выполнения. Вам нужно #import заголовка времени выполнения, но там есть хороший метод с именем method_setImplementation. Это будет работать примерно так:

id targetObject = [SomeClass sharedDelegate];
Method methodToModify = class_getInstanceMethod([targetObject class], @selector(replaceMe:argument:));
IMP newImplementation = [self methodForSelector:@selector(overriddenDelegateMethod:Arg:)];
method_setImplementation(methodToModify, newImplementation);

Это может не сработать в вашем конкретном случае, поскольку class_getInstanceMethod может не возвращать метод для метода, определенного в принятом протоколе, но это "правильный" способ извлечения метода IMP.

...