iOS 從main函式開始

2021-08-05 22:12:11 字數 3207 閱讀 5179

然後就是main中的**  

@autoreleasepool

首先說說uikit_extern,

#ifdef __cplusplus

#define uikit_extern extern "c" __attribute__((visibility ("default")))

#else

#define uikit_extern         extern __attribute__((visibility ("default")))

#endif

巨集定義 #ifdef __cplusplus,如果巨集定義了__cplusplus,則#define uikit_extern extern "c" __attribute__((visibility ("default"))),否則

#define uikit_extern         extern __attribute__((visibility ("default")))

區分在是否定義了__cplusplus,__cplusplus很直觀的翻譯cpp,也就是c++。__cplusplus標示符用來判斷程式是用c還是c++編譯程式編譯的。當編譯c++程式時,這個標示符會被定義,編譯c程式時,不會定義。接著對全句理解,如果已經巨集定義了__cplusplus(也就是說當前源**被當作c++源**處理。否則當前源**被當中c源**處理),那麼extern "c" __attribute__((visibility ("default")))。

extern "c"很好理解,在c++發明之初,為了相容在當時正處主流的c語言,按照c編譯方式進行編譯的作用。可以理解為extern "c"就是告訴編譯器(也就是xcode)在編譯的時候,要按照原來c語言的編譯方式對(全域性)函式和變數進行編譯。

c++是一種「不完全的面相物件語言」,對比c/c++ 兩種編譯方式,c++支援過載,從而使得函式的編譯方式不得不同於c的編譯,舉個栗子,有個函式,更新學生資訊的void updatastudentinfo(int, int);c方式去編譯此函式,不會對函式名進行特殊處理,編譯後的函式名為_updatastudentinfo,反觀c++方式的編譯,為了支援過載,updatastudentinfo函式會變成類似_updatastudentinfo_int_int的函式名,同樣void updatastudentinfo(float, int)會編譯成_updatastudentinfo_float_int類似的函式名。這些都可在.obj檔案中檢視。此處對於c/c++混編互調的深層學習以及使用,不做分析,我只是個搞ios的,在編譯後尋找函式名等多少也能說出些來,但實在不算熟悉,就不誤人子弟了。

接下來就是__attribute__((visibility ("default"))),同出於c系語言,__attribute__是用來設定屬性的,包括函式、變數、型別,這裡我們使用的是設定函式的屬性,__attribute__聽傳聞說是自測利器,同樣在c中,或者c++中,作為入門級的ioser,理解就可。visibility屬性是設定將本專案的函式作為庫使用時的可見性。

設定了__attribute__((visibility ("default"))),函式的public屬性對外可見。

so,總結成一句話,uikit_extern就是將函式修飾為相容以往c編譯方式的、具有extern屬性(檔案外可見性)、public修飾的方法或變數庫外仍可見的屬性。

2、從給定的應用程式委託類,初始化乙個應用程式委託。並把該委託設定為應用程式的委託,這裡就有如果傳入引數為nil,會呼叫函式訪問 info.plist檔案來尋找主nib檔案,獲取應用程式委託。 

3、啟動主事件迴圈,並開始接收事件。 

endps 1:再說說__nullable和__nonnull。在swift中,可以使用!和?來表示乙個物件是optional的還是non-optional,如view?和view!。而在objective-c中則沒有這一區分,view即可表示這個物件是optional,也可表示是non-optioanl。當swift與oc混編的時候,swift編譯器並不知道乙個objective-c物件到底是optional還是non-optional,因此這種情況下編譯器會隱式地將objective-c的物件當成是non-optional。為了解決這個問題,蘋果在xcode 6.3引入了乙個objective-c的新特性:nullability annotations。這一新特性的核心是兩個新的型別注釋:__nullable和__nonnull。從字面上我們可以猜到,__nullable表示物件可以是null或nil,而__nonnull表示物件不應該為空。當我們不遵循這一規則時,編譯器就會給出警告。

在任何可以使用const關鍵字的地方都可以使用__nullable和__nonnull,不過這兩個關鍵字僅限於使用在指標型別上。而在方法的宣告中,我們還可以使用不帶下劃線的nullable和nonnull。

在屬性宣告中可以這樣使用:@property (nonatomic, copy, nonnull) nsstring * name;

也可以這樣使用:@property (nonatomic, copy) nsstring * __nonnull name;

ns_assume_nonnull_begin和ns_assume_nonnull_end。在這兩個巨集之間的**,所有簡單指標物件都被假定為nonnull。nullable的可以在兩個巨集之間的**中單獨指定。

ps 2:nsstringfromclass

正常來說,

id my = [[nsclassfromstring(@"wohenshuai") alloc] init]; 和

id my = [[wohenshuai alloc] init];

是一樣的。但是,如果你的程式中並不存在wohenshuai這個類,下面的寫法會出錯,而上面的寫法只是返回乙個空物件而已。

因此,在某些情況下,可以使用nsclassfromstring來進行你不確定的類的初始化。

nsclassfromstring的好處是:

1 弱化連線,因此並不會把沒有的framework也link到程式中。

2 不需要使用import,因為類是動態載入的,只要存在就可以載入。因此如果你的toolchain中沒有某個類的標頭檔案定義,而你確信這個類是可以用的,那麼也可以用這種方法。

類似的函式如下:

nsclassfromstring

nsgetsizeandalignment

nslog

nslogv

nsselectorfromstring

nsstringfromclass

nsstringfromselector

程式是從main主函式開始執行嗎?

很多人開始學計算機語言,編寫 時都會有乙個疑問 程式真的是從main主函式開始的嗎?之前什麼都不做嗎?main結束後就不能執行其他函式了嗎?下面本篇文章就為此問題做乙個簡單的解釋。作業系統在裝載程式之後,首先執行的不是main程式的第一行,在執行mian主函式之前其實還有一些別的 需要執行,這些 負...

剖析 為什麼c語言從main函式開始執行程式

今天學習c 突然想到為什麼程式要從main函式開始執行。也忘記老師有沒有講過,甚至有些遺忘。擔心之餘開始前往csdn進行查詢學習,終於在乙個大神部落格學習到了,現在分享給大家。main只是開發工具所規定的乙個特殊函式名稱而已。它既不是程式的入口,也不是必須要有的函式。程式的入口點記錄在可執行檔案中的...

iOS被忽略的main函式

本文 幻想鄉的技術宅 如同任何基於c的應用程式,程式啟動的主入口點為ios應用程式的main函式。在ios應用程式,main函式的作用是很少的。它的主要工作是控制uikit framework。因此,你在xcode中建立任何新的專案都配備了乙個預設的主函式。除了少數特例外,你永遠不應該改變這個函式的...