5

多くのメソッドがそのスーパー クラス メソッドを呼び出す必要があり、一部のメソッドは必要ないことを知っています。

メソッドのスウィズリングについてsthについて調べています。ロードメソッドで初期化されており、チュートリアルにはありません[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 を追加するために、このスウィズリングを作成します。

ナビゲーションの破損の問題またはこのメソッドのスウィズリングについて教えていただければ、私も非常に感謝しています。

4

1 に答える 1

8

NSObjectドキュメントから (強調を追加):

クラスのメソッドは、そのスーパークラスのすべてのメソッドの後に+load呼び出されます。+load

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

于 2015-12-31T06:52:39.183 に答える