簡體   English   中英

在用類別子類化類時如何避免編譯警告?

[英]How to avoid compile warning when subclassing a class with category?

說我們有家長班

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. 有沒有一種方法可以刪除警告標志,但又不會失去將方法保持私有狀態的能力。

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

首先,請注意,您的“空類別”根本不是一個類別,它是一個類擴展。 類擴展與類別非常相似,但它們是Objective C 2.0中的新功能,它們的用法略有不同。 首先,如果您未在類擴展中實現方法,但編譯器不會針對類別,則將向您發出警告。 無論如何,關於手頭的問題...

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

因此,如果要在子類中使用“私有”方法,則只需要某種方式向編譯器顯示這些方法存在。 我最喜歡的模式是在單獨文件中的Category中聲明私有方法(例如MyClass_private.h)。 然后,僅將該接口導入基類和需要查看該接口的任何派生類的實現文件。

我有一個解決方案,但通常我會建議不要這樣做。 如果使用-w編譯文件(禁止所有警告),該警告將消失。 我不知道此消息是否有特定的警告標志,如果存在,則可以使用#pragma GCC diagnostic ignored "-Winstance-method-not-found" ,但是抱歉,我找不到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM