2015-12-31 13 views
5

So che molti metodi devono chiamare il suo metodo di classe super e alcuni metodi non hanno bisogno,metodo non [carico] bisogno di chiamare [carico eccellente]

sto cercando su sth sul metodo swizzling.It di inizializzato in il metodo di caricamento, e nel tutorial non c'è [super load].

Mi chiedo se è sbagliato o non c'è solo bisogno di chiamare [super load].

+ (void)load { 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     Class class = [self class]; 

     // When swizzling a class method, use the following: 
     // Class class = object_getClass((id)self); 

     SEL originalSelector = @selector(pushViewController:animated:); 
     SEL swizzledSelector = @selector(flbs_pushViewController:animated:); 

     Method originalMethod = class_getInstanceMethod(class, originalSelector); 
     Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); 

     BOOL didAddMethod = 
     class_addMethod(class, 
         originalSelector, 
         method_getImplementation(swizzledMethod), 
         method_getTypeEncoding(swizzledMethod)); 

     if (didAddMethod) { 
      class_replaceMethod(class, 
           swizzledSelector, 
           method_getImplementation(originalMethod), 
           method_getTypeEncoding(originalMethod)); 
     } else { 
      method_exchangeImplementations(originalMethod, swizzledMethod); 
     } 
    }); 
} 

#pragma mark - Method Swizzling 

- (void)flbs_pushViewController:(UIViewController *)viewController animated:(BOOL)animated { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self flbs_pushViewController:viewController animated:animated]; 
    }); 
    NSLog(@"flbs_pushViewController"); 
} 

Tra l'altro, questo metodo viene utilizzato per risolvere il danneggiamento di navigazione.

Mi è capitato di riapparire il problema a volte, e l'ho debuggerato, penso che riguardi la discussione. Quindi faccio questo swizzling per aggiungere sth nel metodo di sistema.

Se si riesce a capire il problema della corruzione della navigazione o di questo metodo di swizzling, lo apprezzo molto.

+0

Best practice per chiamare [super carico] in modo che tutti i componenti ricevano la comunicazione dell'evento che si sta verificando. – nikhil84

risposta

6

Dal NSObject documentation (il corsivo è mio):

metodo +load di una classe si chiama dopo tutti +load metodi sue superclassi.

Ciò significa che non è necessario chiamare [super load] dal codice. Il metodo load da tutte le superclassi è già stato chiamato dal runtime Objective-C prima del viene chiamato il metodo nella sottoclasse.

+0

Per favore fatemi sapere * cosa * è sbagliato in questa risposta. –

+0

Penso che la risposta sia perfettamente giusta ... –

+1

... Quindi, se chiami '[super carico];', l'implementazione della superclasse eseguirà _twice_! –