2015-12-31 5 views
5

私は多くの方法がそのスーパークラスのメソッドを呼び出す必要があり、いくつかの方法が必要といけないことを知って、ない方法[負荷] [スーパー・ロード]を呼び出す必要が

私は初期化メソッドswizzling.Itの程度がかなっについて探していますロード方法、およびチュートリアルには[super load]はありません。

それが間違っているか、[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"); 
} 

ところで、この方法はナビゲーションの破損を修正するために使用されます。

私はこの問題を時折再現してしまいました。私はそれをデバッグしました。私はそれがスレッドに関するものだと思っています。私はシステムメソッドでsthを追加するためにこの驚くようなことをします。

もしsthにナビゲーションの破損の問題やこの方法がうごめいていると言えるのであれば、私も非常に感謝しています。 NSObject documentation から

+0

[スーパーロード]を呼び出すベストプラクティスで、すべてのコンポーネントがイベントの通信を取得します。 – nikhil84

答えて

6

(強調は追加):

クラスの+load方法は後にそのスーパー+loadすべてのメソッドをと呼ばれています。

つまり、コードから[super load]に電話する必要はありません。 すべてのスーパークラスのloadメソッドは、 というObjective-Cランタイムによって既に呼び出されています。の前に、サブクラスのメソッドが呼び出されます。

+0

この答えで何が間違っているか教えてください。 –

+0

私は答えが完全に正しいと思います.... –

+1

... '[super load];を呼び出すと、スーパークラスの実装は_twice_!を実行します! –

関連する問題