2012-11-08 11 views
5

Come chiamare il metodo originale da uno swizzled?Come chiamare il metodo originale da uno swizzled?

Il metodo originale viene sostituito dal codice:

[[UIWindow class] jr_swizzleMethod:@selector(originalMethod) withMethod:@selector(swizzledMethod) error:nil]; 

Il seguente codice swizzledMethod fa ricorsione!

[self originalMethod]; 

Come risolvere questo problema?

Io uso il seguente libreria per swizzling:

// JRSwizzle.h semver:1.0 
// Copyright (c) 2007-2011 Jonathan 'Wolf' Rentzsch: http://rentzsch.com 
// Some rights reserved: http://opensource.org/licenses/MIT 
// https://github.com/rentzsch/jrswizzle 

#import <Foundation/Foundation.h> 

@interface NSObject (JRSwizzle) 

+ (BOOL)jr_swizzleMethod:(SEL)origSel_ withMethod:(SEL)altSel_ error:(NSError**)error_; 
+ (BOOL)jr_swizzleClassMethod:(SEL)origSel_ withClassMethod:(SEL)altSel_ error:(NSError**)error_; 

@end 
+0

domanda Linked: http://stackoverflow.com/questions/11504133/swizzling-and-super – Dmitry

risposta

14

La risposta è molto interessante:

[self swizzledMethod]; // will call originalMethod 
0

chiamare il proprio metodo ... si swizzeled i puntatori, ma non i nomi. ad es.

originalFunc = $ 123 myFunc = $ 321

swizzle =>

originalFunc = $ 321 myFunc = $ 123

modo di chiamare i $ 123 che oggi chiamiamo myFunc

+0

@Altaveron è giusto, ho appena spiegato di nuovo perché mi sono innamorato anche del primo ... poche volte: D –

3

ero andato attraverso la creazione di metodo swizzling per iOS 5

e ho messo una spiegazione di esso qui .

Method Swizzling in iOS 5?

essenzialmente ogni chiamata al metodo originale sta al tuo. E quindi ogni chiamata al tuo metodo dovrebbe essere reindirizzata all'originale. (Se lo Swizzle è stato impostato correttamente)

Speranza che aiuta

Problemi correlati