2012-03-10 74 views
2

說我們有父類如何在使用類別子類化類時避免編譯警告?

ParentViewController.h

@interface ParentViewController 

.... 

@end 

ParentViewController.m

@interface ParentViewController() 

- (NSArray *)selectedItems; 

@end 

@implementation ParentViewController 

..... 

@end 

然後我們繼承它

ChildViewController.h

@interface ChildViewController : ParentViewController 

.... 

@end 

ChildClassViewController.m

@implementation ChildViewController 

- (void)doSomething 
{ 
    // XCode Warning Flag on this line 
    NSUInteger count = [self selectedItems]; 

    ..... 
} 

的XCode將在註釋行設置警告標誌,並說:「實例方法‘-selectedItems’未找到(返回類型默認爲‘ID’)。

是的我知道在ObjC中沒有私人方法這樣的事情,但使用空的類別類型可以這樣做。但不知何故,它不會被子類繼承。

我通常通過將方法從ParentViewController.m移動到ParentViewController.h來修復它。這感覺很奇怪,我放棄了將方法設置爲私有的能力,因爲我需要對它進行子類化。

現在我的問題是:

  1. 爲什麼父子類找不到在其在.m文件類別聲明的那些方法呢?

  2. 有沒有辦法刪除警告標誌,但不失去保持私有方法的能力。

希望有更多經驗的人能夠幫助解釋這個令人討厭的問題。

回答

3

首先,請注意,您的「空類別」根本不是類別,它是類擴展名。類擴展與類非常相似,但它們在Objective C 2.0中是新的,它們在使用上略有不同。首先,編譯器會警告你,如果你沒有在類擴展中實現一個方法,但它不會與一個類別。無論如何,關於手頭的問題......

Objective-C中的隱私全部是關於可見性。如果編譯器無法看到正在使用的方法的聲明,則會收到警告。請注意,如果您要將您的子類與您的類擴展相同的文件中實現,編譯器不會警告您,因爲它可以看到該聲明。

因此,如果你想在子類中使用「private」方法,你只需要某種方式向編譯器顯示這些方法的存在。我最喜歡的模式是在一個單獨的文件(如MyClass_private.h)中的類別中聲明私有方法。然後,您只能將該接口導入基類的實現文件以及任何需要查看它的派生類。

+0

是的這個作品。在同一個.m文件中結合父類和子類不是一個選項,因爲它們很大。將這些私有方法放在單獨的文件中很麻煩。我會接受這個答案,我不認爲會有任何其他的方式。 – 2012-03-10 02:55:39

+0

@SamuelChandra,是的,同一個文件只是瑣事。你應該永遠不要那樣做。 – 2012-03-10 03:03:49

2

我有一個解決方案,但通常我會建議反對它。如果使用-w編譯文件(禁止所有警告),警告消失。我不知道這條消息是否有特定的警告標誌,如果有的話,您可以使用#pragma GCC diagnostic ignored "-Winstance-method-not-found",但我找不到它,對不起。

+0

+1:正確,但我也建議反對。這些警告是有用的99%的時間:) – 2012-03-10 02:19:33

+0

-w禁止所有警告,不是我可以採取的選項。謝謝 – 2012-03-10 02:36:16

相關問題