3

「Objective-C のメソッド スウィズリング」に関する記事を読みました。この記事での「メソッドの交換」の意味は、2 つのメソッドの実装を交換することです。サンプルは次のとおりです。

- (void) logged_viewDidAppear:(BOOL)animated {
    [self logged_viewDidAppear:animated];
    NSLog(@"logged view did appear for %@", [self class]);
}
+ (void)load {
    static dispatch_once_t once_token;
    dispatch_once(&once_token,  ^{
        SEL viewWillAppearSelector = @selector(viewDidAppear:);
        SEL viewWillAppearLoggerSelector = @selector(logged_viewDidAppear:);
        Method originalMethod = class_getInstanceMethod(self, viewWillAppearSelector);
        Method extendedMethod = class_getInstanceMethod(self, viewWillAppearLoggerSelector);
        method_exchangeImplementations(originalMethod, extendedMethod);
    });
}
- (void) logged_viewDidAppear:(BOOL)animated {
    [self logged_viewDidAppear:animated];
    NSLog(@"logged view did appear for %@", [self class]);
}

記事中の一文は

このメソッドは無意味な再帰呼び出しを自分自身に行うように見えるかもしれませんが、スウィズルした後は実際にはそうしません。

しかし、私はこの声明についてあまり明確ではありません.以下のようなコードを書くとき、それは意味しますか?

[self viewDidAppear], 

その実装が「logged_viewDidAppear」になったため、プログラムはメソッド「logged_viewDidAppear」に移動し、そのメソッドでわかるように、最初の行は [self logged_viewDidAppear:animated] です。同じ理由で、メソッドは「viewDidAppear」になります。私の言葉は正しいですか?

4

1 に答える 1

0

うん。viewDidAppear が呼び出されると、実際には実行時に logged_viewDidAppear の実装にスウィズルされ、logged_viewDidApear が呼び出されます。

これを確認してください: http://nshipster.com/method-swizzling/とこれ https://www.bignerdranch.com/blog/inside-the-bracket-part-7-runtime-machinations/

于 2015-09-07T07:11:27.133 に答える