如果在不考虑交叉引用的情况下,#import “” (嵌入头文件) 在 .h 和 .m 文件中会有什么区别?
求各位大神解答?
伊谢尔伦2017-04-17 17:32:22
在頭檔中引用頭檔會在編譯時就完全得知所引入頭檔的所有介面信息,例如在A.h中導入B.h,將來如果在SubA.h中導入了A.h,隱式地導入了B.h,增加不必要的編譯,內聚度低;
在實現文件中導入頭文件,編譯器只會在需要的時候得知類的接口信息,會減少編譯時間,並且類之間的耦合度會降低
阿神2017-04-17 17:32:22
如題主所說,是面試題的話,就這樣回答好了:
應該盡量在 .m 裡 import,而不是在 .h 裡 import,理由其他答主已經說得很好了。 .h 裡用到的型別盡量用 @class 聲明,然後在 .m 裡 import。只有兩種情況是一定要在 .h 裡 import 的:1. 繼承的父類別 2. 實作某個 protocol。
ringa_lee2017-04-17 17:32:22
.h是描述
.m是實現
一般來說如果.h用到的類別就要在.h中import
如果.h中沒用到的.m中用到的可以放在.m中import (也可.h中)
這個具體看編碼規範
一般為了方便 .h中用到的 在.h中 引用
.m用的在.m中引用
PHPz2017-04-17 17:32:22
你哪邊用就哪邊import
你.h壓根就不用你import的文件你import來幹嘛
不過我的做法基本上都是
在.h用@Class就夠了
在.m採用#import
天蓬老师2017-04-17 17:32:22
我覺得樓上的都沒說到重點。
我覺得最大的區別就是寫在.m中可以有效減少交叉引用,你用心一點,會發現Fundition和UIKit框架中全部使用.m內引用,.h內用Class聲明的方式,這樣做對app運行時沒有影響的,但可以提高編譯器預處理的速度,你的專案越大,這個影響就越明顯。
所以xcode6開始預設模版去掉了從前的公共頭檔.pch文件,就是為了提高編譯速度。
希望能幫到你。
PHPz2017-04-17 17:32:22
Objective-C語言是支援動態特性的,也就是說在編譯時只需要提供聲明,即使不實現也沒有關係,但是在運行時,在真正發送訊息時才會查找對應的實現,若沒有實現則會走對應的流程。
import .h檔只是將頭檔宣告引入,在編譯時期是不管實作的,因此在.m檔中沒有實作對應的方法並不會報錯。
import .m文件通常是實作文件,當然也會有偽私有API(透過Extension實作),在執行時就會找方法selector->IMP關係表了。
防止交叉引用是必須的,因為我們經常重複的引用。
關於動態發送訊息,可以閱讀:http://www.henishuo.com/runtime-message-forwarding/