ios 靜態方法與動態方法詳解
1、問題提出
ios中有靜態方法與動態方法,那麼兩種方法的異同是什麼?
2、問題分析
因為每個物件都由相應的資料結構與方法相構成,乙個程式可能有多個屬於同乙個類的物件,而每個物件的資料結構應該是不一的,但方法是相同的,若為每個物件開闢記憶體空間來儲存方法,必然是對記憶體空間極大的浪費。因此apple是通過類物件與元類來解決這個問題的。
從根本來說,c++、objective-c、j**a都發源於c語言,因此這些語言實際上可以理解了經過封裝的c語言,所以它們更加方便使用但效率不如c語言。
因此,物件的底層實際上就是結構體,其有兩個重要的指標,乙個是isa指標,乙個是super指標。
isa指標:負責指向類物件,用來表明自己是什麼類型別,並能呼叫類物件中的動態方法。
&nbsspbvxerhp; 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"
本文標題: ios 靜態方法與動態方法詳解
本文位址: /ruanjian/ios/180695.html
php靜態方法與非靜態方法用法區別詳解
靜態方法和非靜態方法的區別總結如下 1 靜態方法屬於類所有,類例項化前即可使用。也就是不需要new乙個物件就可以使用該物件的方法。比如object fun1 這樣的格式 2 非靜態方法可以訪問類中的任何成員,靜態方法只能訪問類中的靜態成員 3 因為靜態方法在類例項化前就可以使用,而類中的非靜態變數必...
靜態方法與非靜態方法
靜態類 在類 class 上加入static修飾,表示該類無法被例項化,並且該類中,無法例項化變數或函式。那麼如果要在此靜態類中新增函式 變數 屬性,則必須都是靜態的。靜態類的主要特性 1 僅包含靜態成員。2 無法例項化。3 靜態類的本質,是乙個抽象的密封類,所以不能被繼承,也不能被例項化。4 不能...
靜態方法與非靜態方法
c 的類中可以包含兩種方法 c 靜態方法與非靜態方法。讓我們來看看最直觀的差別 使用了static 修飾符的方法為靜態方法,反之則是非靜態方法。下面我們分四個方面來看看c 靜態方法與非靜態方法的差異 c 靜態方法與非靜態方法比較一 c 靜態成員 靜態成員屬於類所有,非靜態成員屬於類的例項所有。每建立...