2015-12-31 13 views
5

Ich weiß, dass viele Methoden, seine Super-Klasse-Methode aufrufen müssen und einige Methoden nicht brauchen,Does Methode [Last] anrufen müssen [super Last]

Ich bin auf der Suche über etw über Methode swizzling.It des initialisiert in die Lade-Methode, und im Tutorial gibt es keine [super load].

Ich frage mich, ob es falsch ist oder es gibt einfach keine Notwendigkeit, [super load] zu rufen.

+ (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"); 
} 

Übrigens wird diese Methode verwendet, um die Navigation Korruption zu beheben.

Ich zufällig passiert das Problem manchmal, und ich debuggered es, ich denke, es geht um den Thread.So mache ich diese swizzling, um etw in der Systemmethode hinzuzufügen.

Wenn Sie etwas über die Navigation Korruption Problem oder diese Methode Swizzling sagen können, ich auch sehr zu schätzen.

+0

Beste Vorgehensweise zum Aufruf von [super load], damit alle Komponenten die Kommunikation des stattfindenden Ereignisses erhalten. – nikhil84

Antwort

6

Vom NSObject documentation (Hervorhebung hinzugefügt):

Ein +load Methode der Klasse nach all ihrer Ober +load Methoden aufgerufen wird.

Das bedeutet, dass Sie [super load] von Ihrem Code nicht aufrufen müssen. Die Methode load aus allen Oberklassen wurde bereits von der Objective-C-Laufzeit vor die Methode in Ihrer Unterklasse genannt wird.

+0

Bitte lassen Sie mich wissen, * was * ist falsch in dieser Antwort. –

+0

Ich denke, Antwort ist vollkommen richtig .... –

+1

... Also, wenn Sie '[super laden];', die Superklasse 'Implementierung wird _twice_! –