IOS 靜態方法與動態方法詳解
1、問題提出
IOS中有靜態方法與動態方法,那麼兩種方法的異同是什麼?
2、問題分析
因為每個對象都由相應的數據結構與方法相構成,一個程序可能有多個屬於同一個類的對象,而每個對象的數據結構應該是不一的,但方法是相同的,若為每個對象開辟內存空間來存儲方法,必然是對內存空間極大的浪費。因此apple是通過類對象與元類來解決這個問題的。
從根本來說,c++、objective-c、java都發源於c語言,因此這些語言實際上可以理解了經過封裝的c語言,所以它們更加方便使用但效率不如c語言。
因此,對象的底層實際上就是結構體,其有兩個重要的指針,一個是isa指針,一個是super指針。
isa指針:負責指向類對象,用來表明自己是什麼類類型,並能調用類對象中的動態方法。
super指針:表示對象的繼承關系,指向父類,從而能調用父類的相應方法。
類對象:類對象是由元類生成的對象,負責存儲動態方法,動態方法在編譯器是不確定的,因此編譯器也無法檢測與動態方法相關的錯誤,動態方法的調用是在運行期中通過消息機制來執行的,因此也只有運行期才會報錯。
元類:元類是用來存儲靜態方法列表的,編譯器能檢測。
其整體關系如下圖所示:
結論
兩者的差異包括:(1)方法列表是區分開的,分別存儲在類對象與元類中。
(2)動態方法是在運行期中調用,編譯器無法檢測錯誤,靜態方法是在編譯器就確定,編譯器能檢測錯誤。
(3)動態方法由對象調用,靜態方法由類調用,因為調用方法是通過isa和super指針實現的。因此對象只能調用類對象的方法,而類對像能調用元類的方法。
3、相關代碼
(1)靜態、動態方法創建對象
大部分類的靜態方法與動態方法中都存在相應的方法可以用於創建對象,除了兩者的本質差別,兩者的結果是無差異的,都是在堆中創建一個對象的內存,並初始化好各種功能指針。 所以更加推薦使用靜態方法創建對象,方便編譯器檢查錯誤和代碼風格更簡潔。從以下代碼的結果(注釋)中可得驗證以上結論。
//tset --靜態方法與動態方法區別探究 NSString*haha = @"luo1"; //(__NSCFConstantString *) $0 = 0x000dc054 @"luo1" NSString *hehe = [NSStringstringWithFormat:@"luo2"]; //(__NSCFString *) $1 = 0x7904a370 @"luo2" NSString *xixi = [[NSString alloc] initWithFormat:@"luo3"]; //(__NSCFString *) $2 = 0x7904a140 @"luo3"
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
[db:作者簡介][db:原文翻譯及解析]【IOS 靜態方法與動態方法詳解】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!