ios - #import “” (嵌入头文件) 在 .h 和 .m 文件中有什么区别?
高洛峰
高洛峰 2017-04-17 17:30:22
0
7
429

如果在不考虑交叉引用的情况下,#import “” (嵌入头文件) 在 .h 和 .m 文件中会有什么区别?
求各位大神解答?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(7)
伊谢尔伦

在頭檔中引用頭檔會在編譯時就完全得知所引入頭檔的所有介面信息,例如在A.h中導入B.h,將來如果在SubA.h中導入了A.h,隱式地導入了B.h,增加不必要的編譯,內聚度低;
在實現文件中導入頭文件,編譯器只會在需要的時候得知類的接口信息,會減少編譯時間,並且類之間的耦合度會降低

阿神

如題主所說,是面試題的話,就這樣回答好了:

應該盡量在 .m 裡 import,而不是在 .h 裡 import,理由其他答主已經說得很好了。 .h 裡用到的型別盡量用 @class 聲明,然後在 .m 裡 import。只有兩種情況是一定要在 .h 裡 import 的:1. 繼承的父類別 2. 實作某個 protocol。

左手右手慢动作

.h是描述
.m是實現
一般來說如果.h用到的類別就要在.h中import
如果.h中沒用到的.m中用到的可以放在.m中import (也可.h中)

這個具體看編碼規範
一般為了方便 .h中用到的 在.h中 引用
.m用的在.m中引用

PHPzhong

你哪邊用就哪邊import
你.h壓根就不用你import的文件你import來幹嘛

不過我的做法基本上都是
在.h用@Class就夠了
在.m採用#import

Peter_Zhu

我覺得樓上的都沒說到重點。

我覺得最大的區別就是寫在.m中可以有效減少交叉引用,你用心一點,會發現Fundition和UIKit框架中全部使用.m內引用,.h內用Class聲明的方式,這樣做對app運行時沒有影響的,但可以提高編譯器預處理的速度,你的專案越大,這個影響就越明顯。

所以xcode6開始預設模版去掉了從前的公共頭檔.pch文件,就是為了提高編譯速度。

希望能幫到你。

PHPzhong

Objective-C語言是支援動態特性的,也就是說在編譯時只需要提供聲明,即使不實現也沒有關係,但是在運行時,在真正發送訊息時才會查找對應的實現,若沒有實現則會走對應的流程。

import .h檔只是將頭檔宣告引入,在編譯時期是不管實作的,因此在.m檔中沒有實作對應的方法並不會報錯。
import .m文件通常是實作文件,當然也會有偽私有API(透過Extension實作),在執行時就會找方法selector->IMP關係表了。

防止交叉引用是必須的,因為我們經常重複的引用。

關於動態發送訊息,可以閱讀:http://www.henishuo.com/runtime-message-forwarding/

伊谢尔伦

tip:
很多樓並不知道使用 #import 可以防止交叉引用.
這也是 #import 與 #include 的區別.

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!