2013-07-20 1 views
0

Я пытаюсь изучить концепцию swizzling.Метод Swizzling Implentation не имеет места

Несмотря на то, что я добавил method_exchangeImplementations, все же методы не подвергаются swizzled. Любая идея о том, где я ошибаюсь?

#import <objc/runtime.h> 

@interface POCViewController() 

- (void)addSwizzle; 
- (void)originalMethod; 
- (void)swizzledMethod; 

@end 

@implementation POCViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 

    //Add swizzle 
    [self addSwizzle]; 

    //Call the original method 
    [self originalMethod]; 
} 

- (void)addSwizzle 
{ 
    Method original, swizz; 

    original = class_getClassMethod([self class], @selector(originalMethod)); 
    swizz = class_getClassMethod([self class], @selector(swizzledMethod)); 
    method_exchangeImplementations(original, swizz); 
} 

- (void)originalMethod 
{ 
    NSLog(@"Inside original method"); 
} 

- (void)swizzledMethod 
{ 
    NSLog(@"Inside swizzled method"); 
    [self swizzledMethod]; 
} 
+0

Не используйте swizzling вне единичных испытаний и отладки. Это противоречит политике магазина App Store, и это приведет к ужасно хрупкому коду. – bbum

+0

Swizzling не против политики магазина приложений - было ли это раньше, когда был сделан этот комментарий? Это, безусловно, может привести к хрупкому коду, но также позволяет использовать такие аккуратные вещи, как ориентированный на объект код (например: https://github.com/steipete/Aspects). – powerj1984

ответ

1

Вы используете class_getClassMethod, чтобы получить реализацию методов экземпляра, вы должны использовать вместо class_getInstanceMethod.

method_exchangeImplementations все еще используется один и тот же путь

+0

Ах !! Не могу поверить, что я этого не заметил. Большое спасибо Wattson. – footyapps27

+1

нет беспокойство. один способ отлаживать такие вещи, как оригинал и swizz был бы NULL, обычно хороший знак что-то пошло не так – wattson12

+0

yep должен был напечатать значения. эй, у тебя есть какая-то подсказка о прямом вызове? – footyapps27