2015-09-07 38 views
1

我閱讀了article about "Method Swizzling in Objective-C"。在本文中,「方法Swizzing」的含義是交換兩種方法的實現。樣品是如下所示:Objective-C中的方法Swizzling

- (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」。我的話是正確的嗎?

回答