[英]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來修復它。 感覺很奇怪,我只是因為需要將其子類化而失去了將方法設為私有的能力。
現在我的問題是:
為什么父子類無法在.m文件中找到其類別中聲明的那些方法?
有沒有一種方法可以刪除警告標志,但又不會失去將方法保持私有狀態的能力。
希望有更多經驗的人能夠幫助解釋這個煩人的問題。
首先,請注意,您的“空類別”根本不是一個類別,它是一個類擴展。 類擴展與類別非常相似,但它們是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.