你好,歡迎來到IOS教程網

 Ios教程網 >> IOS訊息 >> 關於IOS >> 類方法、實例方法、靜態方法詳細诠釋(重要)

類方法、實例方法、靜態方法詳細诠釋(重要)

編輯:關於IOS

  objective-c中非常重要的語法知識,在此歸納總結一下。 

    類方法,也稱靜態方法,指的是用static關鍵字修飾的方法。此方法屬類本身的方法,不屬於類的某一個實例(對象)。類方法中不可直接使用實例變量。其調用方式有三種:可直接調用、類名.方法名、對象名.方法名。實例方法指的是不用static關鍵字修飾的方法。每個實例對象都有自身的實例方法,互相獨立,不共享一個。其調用方式只能是對象名.方法名。  用修飾符static聲明的方法為靜態方法,不用修飾符static聲明的方法為實例方法。不管類生成或未生成對象,類的靜態方法都可以被使用,使用格式為:類名.靜態方法名。靜態方法只能使用該靜態方法所在類的靜態數據成員和靜態方法。這是因為使用靜態方法時,該靜態方法所在類可能還沒有對象,即使有對象,由於用類名.靜態方法名方式調用靜態方法,靜態方法沒有this指針來存放對象的地址,無法判定應訪問哪個對象的數據成員。在類創建對象後,實例方法才能被使用,使用格式為:對象名.實例方法名。實例方法可以使用該方法所在類的所有靜態成員和實例成員。  何時用靜態方法,何時用實例方法?  先說實例方法,當你給一個類寫一個方法,如果該方法需要訪問某個實例的成員變量時,那麼就將該方法定義成實例方法。一類的實例通常有一些成員變量,其中含有該實例的狀態信息。而該方法需要改變這些狀態。那麼該方法需要聲明成實例方法。        靜態方法正好相反,它不需要訪問某個實例的成員變量,它不需要去改變某個實例的狀態。我們把該方法定義成靜態方法。    關於靜態方法和實例方法的一些誤區。   一、靜態方法常駐內存,實例方法不是,所以靜態方法效率高但占內存。   事實上,方法都是一樣的,在加載時機和占用內存上,靜態方法和實例方法是一樣的,在類型第一次被使用時加載。調用的速度基本上沒有差別。      二、靜態方法在堆上分配內存,實例方法在堆棧上。          事實上所有的方法都不可能在堆或者堆棧上分配內存,方法作為代碼是被加載到特殊的代碼內存區域,這個內存區域是不可寫的。      三、實例方法需要先創建實例才可以調用,比較麻煩,靜態方法不用,比較簡單。          事實上如果一個方法與他所在類型的實例無關,那麼它就應該是靜態的,決不會有人把它寫成實例方法。所以所有的實例方法都與實例有關,既然與實例有關,那麼創建實例就是必然的步驟,沒有麻煩簡單一說。實際上上你可以把所有的實例方法都寫成靜態的,將實例作為參數傳入即可。      有些方法看似與所在的實例無關,如IComparer.Compare方法,但實際上每一個實現這個接口的類都只會負責自己類型實例的比較,這是C#1.x規范中沒有泛型所帶來的歷史遺留問題。      大部分靜態方法是與類的實例有關的,如各種Parse方法,他做成靜態的原因是他沒有實例作為參數。其他的大多是出於語義或者其他目的的考慮。  第一種方式, 聲明實例,調用實例方法      當一個類有多個實例,例如學生這個類,實例可以有學生甲,學生乙,學生丙,等等,我們就用第一種方式。在多線程的情況下,只要每個線程都創建自己的實例,那麼第一種方法通常是線程安全的。    第二種方式,通過一個靜態的實例,去調用實例方法    這種情況比較特殊,通常是整個程序裡該類唯一的一個實例,我們通過調用該實例的實例方法來改變該實例的某些狀態。這一個實例在多線程的情況下,通常是線程不安全的。除非我們給這個實例加鎖。防止其他線程訪問該實例。    第三種方式,直接調用靜態方法    這種情況下靜態方法不需要去改變某個實例的狀態。只要得到少量的參數就可完成既定事情。比如判斷一個文件是否存在,只要給個文件路徑和文件名,就能知道該文件是否存在。    函數又叫方法(Methods) 方法Methods又可稱為函數。在Objective-C 裡的類可以定義兩種方法。一種是實例的方法,一種是類的方法。實例的方法局限於某個類的實例,也就是必須定義這個類的實例之後,才能被調用執行的方法。類的方法不需要創建實例,直接通過類的名稱就可以被調用執行的方法。 定義一個方法需要:方法名(一個或者多個關鍵字),返回值類型,參數類型和參數名。下面這的圖詳細的說明了如何定義一個實例的方法,其中負號[-]表示該方法為實例的方法,該方法的名稱加上各個關鍵字包括冒號即為[insertValue:atIndex:]。   Objective-C 調用方法是通過發送消息給對應的實例對象。發送消息的方式其實是和一般的編程語言一樣就是調用實例對象的方法,Objective-C獨特的地方就是方法的調用是通過一個方法名+零個或多個標示符+零個或多個參數,然而一般的編程語言只需要一個方法名+零個或多個參數就可以了。Objective-C 裡面之所以把調用方法稱為發送消息,大概是因為所有的消息發送之後都是動態傳遞給實例對象的。並且,如果一個子類定義了一個和父類相同方法名+標示符的方法之後,子類會先收到該消息,然後選擇性的是否繼續將該消息傳遞給父類。 發送消息是通過一對方括號[]來實現的。在括號的裡面,實例對象在左邊,消息以及參數等的定義在右邊。例如: [anObject insertValue:anObj atIndex:1];  [anObject insertValue:anObj atIndex:1]; 為了避免生成多余的臨時變量,Objective-C 容許直接使用消息的結果。如下例: [[anObject getArray] insertValue:[anObject getValueToInsert] atIndex:0];  [[anObject getArray] insertValue:[anObject getValueToInsert] atIndex:0]; 類的方法,類似於靜態方法(Static Function),常用於作為工廠模式中用來生成新的實例。定義的時候和實例的方法有區別的地方就是開頭的符號為加號[+]。調用的類的方法和調用(Static Function)基本相同,直接通過類名就可以。    objective-c中非常重要的語法知識,在此歸納總結一下。    類方法,也稱靜態方法,指的是用static關鍵字修飾的方法。此方法屬類本身的方法,不屬於類的某一個實例(對象)。類方法中不可直接使用實例變量。其調用方式有三種:可直接調用、類名.方法名、對象名.方法名。實例方法指的是不用static關鍵字修飾的方法。每個實例對象都有自身的實例方法,互相獨立,不共享一個。其調用方式只能是對象名.方法名。  用修飾符static聲明的方法為靜態方法,不用修飾符static聲明的方法為實例方法。不管類生成或未生成對象,類的靜態方法都可以被使用,使用格式為:類名.靜態方法名。靜態方法只能使用該靜態方法所在類的靜態數據成員和靜態方法。這是因為使用靜態方法時,該靜態方法所在類可能還沒有對象,即使有對象,由於用類名.靜態方法名方式調用靜態方法,靜態方法沒有this指針來存放對象的地址,無法判定應訪問哪個對象的數據成員。在類創建對象後,實例方法才能被使用,使用格式為:對象名.實例方法名。實例方法可以使用該方法所在類的所有靜態成員和實例成員。  何時用靜態方法,何時用實例方法? 
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved