2016-01-15 26 views
0

我添加了兩類RegisterViewController。他們有相同的func命名爲djTest。象下面這樣:如何在Objective-C中處理基類中兩個相同的方法?

NewRegisterViewController + TestA.h

@interface NewRegisterViewController (TestA) 
-(void)djTest; 
@end 

NewRegisterViewController + TestA.m

@implementation NewRegisterViewController (TestA) 
-(void)djTest{ 
    NSLog(@"djTest call TestA"); 
} 
@end 

NewRegisterViewController + TestB.h

@interface NewRegisterViewController (TestB) 
-(void)djTest; 
@end 

NewRegisterViewController + TestB.m

@implementation NewRegisterViewController (TestB) 
-(void)djTest{ 
    NSLog(@"djTest call TestB"); 
} 
@end 

,並在NewRegisterViewController.m

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    if ([self respondsToSelector:@selector(djTest)]) { 
     [self performSelector:@selector(djTest)]; 
    } 
} 

,每天當我運行時輸出 「djTest呼叫泰斯塔」 控制檯。

我的問題是:

  1. 的時候我並沒有在NewRegisterViewController.m導入NewRegisterViewController + TestA.h,也djTest功能可以找到並執行。那麼這個函數何時添加到NewRegisterViewController實例中。當類加載?或者第一次使用籠子或其他時間?

  2. 我導入了NewRegisterViewController + TestA.h和NewRegisterViewController + TestB.h,編譯器確實給了我多個djTest函數的警告。那麼如何避免不同類別中的多重功能?總是我不知道其他暗示這個功能。

+0

這對我來說要求TESTB的功能。不是A.請參閱示例[here](https://www.dropbox.com/s/ly9n5xq6wraw9qg/CategoryTest.zip?dl=0) – iphonic

+4

對於給定的類,在Objective C中不可能有兩個具有相同名稱的類別。在運行期間,任何一個方法都會被調用。 –

+1

@iphonic可能取決於哪種方法最後添加。所以我的第一個問題是它何時添加。 – qiushuitian

回答

0

首先,您必須瞭解更多有關類別如何工作的信息。

當你創建一個類,比如MyClass,你可以在類對象中指向它的方法實現。 MyClass的所有實例的類對象都是相同的。

您可以通過objc/objc-runtime.h中提供的函數在運行時管理類對象。

類別工作完全相似的技術。他們只是添加新的方法到你的類對象。這意味着,如果您定義了類別,則運行時將在應用程序啓動時將其所有方法實現加載到指定的類。

如果您爲同一個類和方法定義了另一個類別,它只會爲您的對象類添加相同的方法。在這種情況下,不可能確定你的類將包含哪些實現。

所以,類別都是關於運行時。像你描述你的問題一樣,不可能以這種方式使用它。

運行時不是黑匣子。您可以在文檔閱讀更多關於它:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/#//apple_ref/doc/uid/TP40001418-CH1g-126286

還可以看到即使是Objective-C運行的源代碼:http://www.opensource.apple.com/source/objc4/objc4-437.1/runtime/

+0

總是我沒有使用類似我的描述。但我寫的類別可能會取代其他人或框架編寫的類別。我不知道是否實現了它或方法名稱。 – qiushuitian

+0

@qiushuitian你必須在編寫代碼時檢查它。只需在某個對象上調用'respondsToSelector:',以確保它不提供與要實現的方法相同的方法。另一種方法是使用方法前綴,如'ap_someMethod:',其中'ap'是您的前綴。這是Apple向Objective-C開發人員推薦的方式。 –

相關問題