Objective-C 基礎教程第六章,原始檔組織

VxerLee暱稱已被使用發表於2022-03-07

Object-C 基礎教程第六章,原始檔組織

0x00:前言

到目前為止,我們討論過的所有專案都是把原始碼統統放入到了main.m檔案中。這樣隨著專案越來越大,檔案內容會越來越多,到後面我們的專案就不太好管理,因為所有東西都寫在一起搜尋起來也比較費勁。

現在我們需要學習Xcode用類檔案的方式來區分.h .m將類,單獨分類成檔案的形式。

0x01:Xcode建立OC類

因為書中的例子已經非常老了不再適用,我這裡用最新的Xcode13來演示之前的Car程式。

image-20220307222713606

選擇CocoClass

image-20220307222751409

輸入類名,並且選擇繼承自NSObject

image-20220307222826043

接著我們就建立好了我們的Engine類,然後我們把main.m中的Engine類程式碼給移植過去。

image-20220307222923931

接著你們可以重複如上的操作,將其他類也建立成類檔案,並且將程式碼移植過去最後如下圖。

這樣程式碼結構就清晰多了,而且後續要新增修改程式碼,就在指定的類檔案中修改即可。

image-20220307223758678

0x02:Xcode群組

Xcode群組有兩種,一種是會建立資料夾,將你的檔案移動到資料夾裡。還有一種是不會建立資料夾,只是在Xcode中看起來比較結構清晰 理論上的群組。

image-20220307225310995

並沒有建立資料夾。

image-20220307225326138

這樣檔案管理,程式碼結構上看著就又更加舒服 清晰了。

image-20220307225414737

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

神奇,我們修改後還是可以編譯,使得程式正常執行。

image-20220307231130654

說明:@class建立了一個前向引用。這是在告訴編譯器:"相信我。以後你自然會知道這個類到底是什麼,但是現在,你知道這些足矣。"

匯入和繼承

當我們想在子類裡面也用上面這種方式就不行了,因為被繼承的類他需要確切的知道父類中的詳細資料,比如方法比如屬性,這樣你才能繼承他,這樣你才能重寫他的方法。

image-20220307231605266

小結

在本章中,我們學習了使用多個檔案來組織我們的原始碼的基本技巧。這樣使得我們看程式碼更加輕鬆,而且方便管理。

我們還學習了@class關鍵字的依賴關係,使得我們在編譯檔案時,可以讓其時間變短,這得益於@class這關鍵字。

相關文章