當我通過xCode編譯我的應用程序項目時,我得到了太多警告,大多數人說:'myClass'可能不會響應'+ isAliveNetworkConnection:',雖然'isAliveNetworkConnection'方法是在.m文件但它沒有在.h文件中聲明,我發現它可以工作,所以我不想再次在頭文件中重寫;Objective C語法和編譯警告
我認爲Objective C並不是說服用比Java ...也許我太懶惰了? :D
有沒有人有同樣的想法?
當我通過xCode編譯我的應用程序項目時,我得到了太多警告,大多數人說:'myClass'可能不會響應'+ isAliveNetworkConnection:',雖然'isAliveNetworkConnection'方法是在.m文件但它沒有在.h文件中聲明,我發現它可以工作,所以我不想再次在頭文件中重寫;Objective C語法和編譯警告
我認爲Objective C並不是說服用比Java ...也許我太懶惰了? :D
有沒有人有同樣的想法?
Objective-C是一種動態語言。 (編譯時)發送消息給沒有實現適當方法的類是完全正確的。您也可以在運行時將類添加到類中! Objective-C會讓你擺脫很多東西。但是,除非您有足夠的理由這樣做,否則通常應該避免這種做法。
正如你所發現的那樣,你可以「允許」跳過.h文件中的聲明方法,但不建議這樣做。爲什麼?首先,如果其他人正在閱讀您的代碼,可以更容易地獲得所有實施方法的快速列表。其次,如果您正在調試您的代碼,並且發生崩潰,比如objc_msgsend,對象正在發送消息,它將不會響應,您可以輕鬆追蹤此問題,因爲它會作爲警告發生在您的碼。如果你總是避免在你的.h文件中使用命名函數,那麼你將會有數百(數千?)個警告,並且它們都不容易被篩選出來。
總之,你可以逃脫很多,但你通常應該遵循「好」的編碼實踐。
C和Java是不同的。你必須告訴編譯器你的類在界面中實現了什麼方法,否則它無法知道,這就是爲什麼你會得到警告。
嗨,感謝您的回答,我知道C和Java語法不同......也許我的問題是無稽之談,我只是希望開發工具可以更容易使用,並且可以升級。 – iXcoder
如果您希望此警告消失,您需要聲明您在頭文件中使用的所有方法。編譯器不知道.m文件中的方法,除非你這樣做。
你可以實現你不想在頭私有方法通過使用類,像這樣:
在YourClass.m:
@interface YourClass (Private)
- (void)yourPrivateMethod;
@end
@implementation YourClass
- (void)yourPrivateMethod
{
//do stuff
}
@end
頭文件是官方您的班級的API。如果你沒有指定那裏的東西,編譯器會假設使用該選擇器的其他代碼正在使用一些內部功能。
它給你一個警告的原因是錯誤地這樣做會冒險給你的代碼添加不需要的副作用,如果維護類是非官方API的那個人決定改變某些東西而不知道別人是依賴於選擇。 (在寫這篇文章的時候,Mike給出了更完整的答案)。
接受我的建議,不要懶惰。除非你非常有經驗,並且知道懶惰的可能性,否則風險相當高,它會在以後回來並咬你。
真正有幫助...與動態更新類行爲。好主意,就像這個功能一樣。 謝謝Mike – iXcoder
也感謝所有的編碼員,:-) – iXcoder