Object-C 基礎教程第六章,原始檔組織
0x00:前言
到目前為止,我們討論過的所有專案都是把原始碼統統放入到了main.m檔案中。這樣隨著專案越來越大,檔案內容會越來越多,到後面我們的專案就不太好管理,因為所有東西都寫在一起搜尋起來也比較費勁。
現在我們需要學習Xcode用類檔案的方式來區分.h .m將類,單獨分類成檔案的形式。
0x01:Xcode建立OC類
因為書中的例子已經非常老了不再適用,我這裡用最新的Xcode13來演示之前的Car程式。
選擇CocoClass
輸入類名,並且選擇繼承自NSObject
接著我們就建立好了我們的Engine
類,然後我們把main.m中的Engine類程式碼給移植過去。
接著你們可以重複如上的操作,將其他類也建立成類檔案,並且將程式碼移植過去最後如下圖。
這樣程式碼結構就清晰多了,而且後續要新增修改程式碼,就在指定的類檔案中修改即可。
0x02:Xcode群組
Xcode群組有兩種,一種是會建立資料夾,將你的檔案移動到資料夾裡。還有一種是不會建立資料夾,只是在Xcode中看起來比較結構清晰 理論上的群組。
並沒有建立資料夾。
這樣檔案管理,程式碼結構上看著就又更加舒服 清晰了。
0x03 Xcode跨檔案依賴關係
依賴關係(dependency
)是兩個實體之間的一種關係。
在程式設計和開發過程中,經常會出現關於依賴關係的問題,比如Slant6類因繼承了Engine類,那麼當Engine類發生了變化,比如新增了新的例項變數,那麼Slant6就依賴於Engine類,並且需要才行編譯Slant6來適應這個變化,那麼這裡就有一個問題,假如我們有超級多的.m檔案用了這個Engine標頭檔案,那麼豈不是得花超長時間來編譯?
@class關鍵字
為了解決如上的問題,好在Objective-C
引入了關鍵字@class
用來告訴編譯器,這是一個類,所以我只會通過指標來引用他
,這樣編譯器就不需要知道.h類檔案中的所有成員和方法了,節省了不少時間。ps:那麼請猜測或者動手實踐一下,加入我們逆向分析的時候還能匯出對應的類標頭檔案嗎?或者對應標頭檔案中他還會顯示型別嗎?
。
#import <Foundation/Foundation.h>
@class Tire; //修改成@class方式 引入類指標。
@class Engine;
//#import "Engine.h" //將這裡註釋了
//#import "Tire.h"
NS_ASSUME_NONNULL_BEGIN
/*
汽車
*/
@interface Car : NSObject
{
Engine *engine;
Tire *tires[4];
}
-(Engine *)engine;
-(void) setEngine:(Engine *) newEngine;
-(Tire*) tireAtIndex:(int) index;
-(void) setTire:(Tire*) tire atIndex:(int) index;
-(void) print;
@end
NS_ASSUME_NONNULL_END
神奇,我們修改後還是可以編譯,使得程式正常執行。
說明:@class建立了一個前向引用。這是在告訴編譯器:"相信我。以後你自然會知道這個類到底是什麼,但是現在,你知道這些足矣。"
匯入和繼承
當我們想在子類裡面也用上面這種方式就不行了,因為被繼承的類他需要確切的知道父類中的詳細資料,比如方法比如屬性,這樣你才能繼承他,這樣你才能重寫他的方法。
小結
在本章中,我們學習了使用多個檔案來組織我們的原始碼的基本技巧。這樣使得我們看程式碼更加輕鬆,而且方便管理。
我們還學習了@class
關鍵字的依賴關係,使得我們在編譯檔案時,可以讓其時間變短,這得益於@class這關鍵字。