IOS學習筆記38

2021-12-29 22:41:46 字數 2432 閱讀 5177

解析:

很多剛開始學習ios開發的同學可能在看別人的**的時候會發現有部分#import操作寫在 .m 檔案中,而 .h 檔案僅僅使用@class進行宣告,不禁納悶起來,為什麼不直接把#import放到**件中呢?

這是因為 .h 檔案在修改後,所有 #import 該 .h 檔案的所有檔案必須重 新build,因此,如果把 #import 寫在 .h 檔案中,#impor t該 .h 檔案的檔案也就會產生不必要的編譯,增加編譯時間,特別是在專案檔案多的情況 下。想象一下,如果只是修改乙個 .h 檔案而導致上百個檔案不必要的編譯,那是一件多麼讓人糾結的事情。。。對於@class只是告訴編譯器有這個class,請不要報錯或警告,因此不會給編譯造成影響。

下面來說一下#import同class之間的區別

在ios中我們經常會在.h和.m中引入一些類啊等等一般用的是#import來進行宣告,你們可能也見到在.**件進用@class來宣告的,那麼#import和@class進行宣告 到底有什麼的區別呢?

1. import會包含這個類的所有資訊,包括實體變數和方法,而@class只告訴編譯器,宣告的類的名稱,至於這些類是如何定義的,暫時不用考慮,所以在標頭檔案中如果用@class宣告某個類後,在.m的實現中如果用到宣告類的具體方法或變數時還得再#import類  。

2.在.h標頭檔案中進行宣告時用#import的話,如果100個頭檔案都#import同乙個頭件,或者這些檔案是依次引用的,如a->b,b->c,c->d,當最開始的那個標頭檔案有變化後進行編譯時,後面所有引用它的類都需要重新編譯,如果引用最開始的標頭檔案的類很多的話,那麼這將耗費大量的時間,而用@class則不會,可能有人會想即然.h只是用@class只是簡單的乙個宣告告編譯器有這個類不讓其報錯,那麼.m中要用到引入的類的方法和屬性時,不還是要#import標頭檔案一次,是的這個是對的,但編譯器編譯的時候只編譯標頭檔案的,所以你的.m中用#import與編譯時間沒太大關係

接下來說說什麼時候該用@class,什麼時候該用#import進行宣告

1.一般如果有繼承關係的用#import,如b是a的子類那麼在b中宣告a時用#import

2. 另外就是如果有迴圈依賴關係,如:a->b,b->a這樣相互依賴時,如果在兩個檔案的標頭檔案中用#import分別宣告對方,那麼就會出現標頭檔案迴圈利用的錯誤,這時在標頭檔案中用@class宣告就不會出錯

3.還有就是自定義**的時候,如果在標頭檔案中想宣告**的話如@inte***ce secondviewcontroller:uiviewcontroller時應用#import不然的話會出錯誤,注意xxxxdelegate是自定義的

在分析 #imclude 和 #include的用法

#include

區分 #include 與#include "x.h"的作用

#include :它用於對系統自帶的標頭檔案的引用,編譯器會在系統檔案目錄下去查詢該檔案.

#include "x.h":使用者自定義的檔案用雙引號引用,編譯器首先會在使用者目錄下查詢,然後到安裝目錄中查詢,最後在系統檔案中查詢。

在使用#include的時候要注意處理重複引用(這也是objc中#include與#import的區別)

例如:classa 與 classb同時引用了classc,不做重複引用處理的時候在classd中同時引用classa,classb編譯會提示對classc重複引用的錯誤.

我們可以:#ifndef _classc_h

#define _classc_h

#include "classc"

#endif

這樣處理在編譯時就不會有重複引用的錯誤出現(在objc中#import解決了這個問題,這是它們的區別)

#import

#import 大部分功能和#include是一樣的,但是他處理了重複引用的問題,我們在引用檔案的時候不用再去自己進行重複引用處理.

@class

主要是用於宣告乙個類,告訴編譯器它後面的名字是乙個類的名字,而這個類的定義實現是暫時不用知道的,後面會告訴你.也是因為在@class僅僅只是宣告乙個類,所以在後面的實現檔案裡面是需要去#import這個類,這時候才包含了這個被引用的類的所有資訊。

綜上所述#include,#import與@class的區別可以做一下理解:

#include與#import在引用乙個類的時候會包含這個類的所有資訊包括變數方法等,但是這樣做會對編譯效率造成影響.比如有99個類都#import了classa,那麼在編譯的時候這99個類都會去對classa處理.又比如a被b引用,b被c引用,c被d引用.....此時如果a被修改,那麼後面的b,c,d.....都需要重新進行編譯.還有乙個用法會引起編譯錯誤的就是在classa中#import classb 在classb中#import classa那麼在編譯的時候也會出現未知錯誤。

所以一般來說,在inte***ce中引用乙個類,就用@class,它會把這個類作為乙個型別來使用,而在實現這個inte***ce的檔案中,如果需要引用這個類的實體變數或者方法之類的,還是需要import這個在@class中宣告的類。

leetcode學習筆記38

for example,given n 3,a solution set is 這道題是借鑑網上的思路解出的,主要摘自 所謂backtracking都是這樣的思路 在當前局面下,你有若干種選擇。那麼嘗試每一種選擇。如果已經發現某種選擇肯定不行 因為違反了某些限定條件 就返回 如果某種選擇試到最後發現...

JUNIT3 8學習筆記(2)

2008年8月14號 天氣陰 周五 junit3.8學習筆記 2 執行testcase類的測試類,在執行每乙個測試類方法之前都會執行setup方法,因此可以將一些重複出現的程式碼寫到setup方法中,也可以將測試資料庫的程式碼連線程式碼寫到setup方法中。同樣,有初始化方法,就有銷毀方法teard...

IOS學習筆記

uiview beginanimations view flip context nil 設定動畫塊 uiview setanimationduration 1.25 動畫時間 uiview setanimationcurve uiviewanimationcurveeaseinout 動畫曲線 u...