欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

IOS 靜態(tài)方法與動態(tài)方法詳解

 更新時間:2017年02月28日 17:04:27   投稿:lqh  
這篇文章主要介紹了IOS 靜態(tài)方法與動態(tài)方法詳解的相關資料,需要的朋友可以參考下

IOS 靜態(tài)方法與動態(tài)方法詳解

1、問題提出

     iOS中有靜態(tài)方法與動態(tài)方法,那么兩種方法的異同是什么?

2、問題分析

     因為每個對象都由相應的數(shù)據(jù)結(jié)構(gòu)與方法相構(gòu)成,一個程序可能有多個屬于同一個類的對象,而每個對象的數(shù)據(jù)結(jié)構(gòu)應該是不一的,但方法是相同的,若為每個對象開辟內(nèi)存空間來存儲方法,必然是對內(nèi)存空間極大的浪費。因此apple是通過類對象與元類來解決這個問題的。

     從根本來說,c++、objective-c、java都發(fā)源于c語言,因此這些語言實際上可以理解了經(jīng)過封裝的c語言,所以它們更加方便使用但效率不如c語言。

     因此,對象的底層實際上就是結(jié)構(gòu)體,其有兩個重要的指針,一個是isa指針,一個是super指針。

     isa指針:負責指向類對象,用來表明自己是什么類類型,并能調(diào)用類對象中的動態(tài)方法。

     super指針:表示對象的繼承關系,指向父類,從而能調(diào)用父類的相應方法。

     類對象:類對象是由元類生成的對象,負責存儲動態(tài)方法,動態(tài)方法在編譯器是不確定的,因此編譯器也無法檢測與動態(tài)方法相關的錯誤,動態(tài)方法的調(diào)用是在運行期中通過消息機制來執(zhí)行的,因此也只有運行期才會報錯。                      

     元類:元類是用來存儲靜態(tài)方法列表的,編譯器能檢測。

     其整體關系如下圖所示:

  結(jié)論

          兩者的差異包括:(1)方法列表是區(qū)分開的,分別存儲在類對象與元類中。
                                       (2)動態(tài)方法是在運行期中調(diào)用,編譯器無法檢測錯誤,靜態(tài)方法是在編譯器就確定,編譯器能檢測錯誤。
                                       (3)動態(tài)方法由對象調(diào)用,靜態(tài)方法由類調(diào)用,因為調(diào)用方法是通過isa和super指針實現(xiàn)的。因此對象只能調(diào)用類對象的方法,而類對像能調(diào)用元類的方法。

3、相關代碼

     (1)靜態(tài)、動態(tài)方法創(chuàng)建對象 

        大部分類的靜態(tài)方法與動態(tài)方法中都存在相應的方法可以用于創(chuàng)建對象,除了兩者的本質(zhì)差別,兩者的結(jié)果是無差異的,都是在堆中創(chuàng)建一個對象的內(nèi)存,并初始化好各種功能指針。 所以更加推薦使用靜態(tài)方法創(chuàng)建對象,方便編譯器檢查錯誤和代碼風格更簡潔。從以下代碼的結(jié)果(注釋)中可得驗證以上結(jié)論。

//tset --靜態(tài)方法與動態(tài)方法區(qū)別探究
  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"

 感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關文章

最新評論