程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Objective-C 關於靜態方法與實例方法的轉載

Objective-C 關於靜態方法與實例方法的轉載

編輯:關於C語言

 

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

類方法,也稱靜態方法,指的是用static關鍵字修飾的方法。此方法屬類本身的方法,不屬於類的某一個實例(對象)。類方法中不可直接使用實例變量。其調用方式有三種:可直接調用、類名.方法名、對象名.方法名。實例方法指的是不用static關鍵字修飾的方法。每個實例對象都有自身的實例方法,互相獨立,不共享一個。其調用方式只能是對象名.方法名。
用修飾符static聲明的方法為靜態方法,不用修飾符static聲明的方法為實例方法。不管類生成或未生成對象,類的靜態方法都可以被使用,使用格式為:類名.靜態方法名。靜態方法只能使用該靜態方法所在類的靜態數據成員和靜態方法。這是因為使用靜態方法時,該靜態方法所在類可能還沒有對象,即使有對象,由於用類名.靜態方法名方式調用靜態方法,靜態方法沒有this指針來存放對象的地址,無法判定應訪問哪個對象的數據成員。在類創建對象後,實例方法才能被使用,使用格式為:對象名.實例方法名。實例方法可以使用該方法所在類的所有靜態成員和實例成員。
何時用靜態方法,何時用實例方法?
先說實例方法,當你給一個類寫一個方法,如果該方法需要訪問某個實例的成員變量時,那麼就將該方法定義成實例方法。一類的實例通常有一些成員變量,其中含有該實例的狀態信息。而該方法需要改變這些狀態。那麼該方法需要聲明成實例方法。

靜態方法正好相反,它不需要訪問某個實例的成員變量,它不需要去改變某個實例的狀態。我們把該方法定義成靜態方法。

關於靜態方法和實例方法的一些誤區。
一、靜態方法常駐內存,實例方法不是,所以靜態方法效率高但占內存。
事實上,方法都是一樣的,在加載時機和占用內存上,靜態方法和實例方法是一樣的,在類型第一次被使用時加載。調用的速度基本上沒有差別。
二、靜態方法在堆上分配內存,實例方法在堆棧上。
事實上所有的方法都不可能在堆或者堆棧上分配內存,方法作為代碼是被加載到特殊的代碼內存區域,這個內存區域是不可寫的。
三、實例方法需要先創建實例才可以調用,比較麻煩,靜態方法不用,比較簡單。
事實上如果一個方法與他所在類型的實例無關,那麼它就應該是靜態的,決不會有人把它寫成實例方法。所以所有的實例方法都與實例有關,既然與實例有關,那麼創建實例就是必然的步驟,沒有麻煩簡單一說。實際上上你可以把所有的實例方法都寫成靜態的,將實例作為參數傳入即可。
有些方法看似與所在的實例無關,如IComparer.Compare方法,但實際上每一個實現這個接口的類都只會負責自己類型實例的比較,這是C#1.x規范中沒有泛型所帶來的歷史遺留問題。
大部分靜態方法是與類的實例有關的,如各種Parse方法,他做成靜態的原因是他沒有實例作為參數。其他的大多是出於語義或者其他目的的考慮。
第一種方式, 聲明實例,調用實例方法
當一個類有多個實例,例如學生這個類,實例可以有學生甲,學生乙,學生丙,等等,我們就用第一種方式。在多線程的情況下,只要每個線程都創建自己的實例,那麼第一種方法通常是線程安全的。
第二種方式,通過一個靜態的實例,去調用實例方法
這種情況比較特殊,通常是整個程序裡該類唯一的一個實例,我們通過調用該實例的實例方法來改變該實例的某些狀態。這一個實例在多線程的情況下,通常是線程不安全的。除非我們給這個實例加鎖。防止其他線程訪問該實例。
第三種方式,直接調用靜態方法
這種情況下靜態方法不需要去改變某個實例的狀態。只要得到少量的參數就可完成既定事情。比如判斷一個文件是否存在,只要給個文件路徑和文件名,就能知道該文件是否存在。

轉載2:
調用一個類的靜態方法需不需要release?(內存管理)(面試題)
我個人認為,靜態成員方法不需要對象,不需要release。
 

注:其實靜態成員方法也是有對象的,叫做類對象,但這個是在第一次訪問類成員時觸發系統將其加載到內存的,而且該類對象只在程序立閉時,才會釋放,並不由程序本身控制。

有三個概念要分清:類、實例和對象,類本身加載到內存(可能是代碼段的內存,不是堆內存,也不是棧內存),可以叫做一個對象;創建一個類的實例,這個實例可以叫做一個對象,所以就有類對象和實例對象之分了,類對象就是一張圖紙,實例對象是按類對象造出的一橦樓,確實都是實實在在存在的東西,所以叫對象,只不過性質不同,一個是圖紙,一個是按圖紙造出來的樓房。

 

其實,我也很想知道,這是哪家公司的面試題,搞得這麼不嚴謹。

從這一句話中,可以有兩種理解,一是類的靜態方法中返回的對象是否需要release;二是調用實例方法需要release嗎?就是說要調用release,需要先alloc+init,這時才能調用實例對象的方法,使用完了,要release;那麼直接調用類的靜態方法,是否需要release類本身的對象。

從以上分析,能得出這樣的結論:該公司剛接觸objectiv-c;該公司面試的人沒有真正熟練和掌握objective-c,也是剛入門的家伙;最後,可能是面試的人說錯了,或此貼提問的人寫錯了。

 

轉載3:

這個好帖子我要馬克一下,今天碰到“靜態方法”一下子沒反應過來,樓主你可幫了我大忙了,那句“靜態方法不需要release因為沒有對象”也給了我啟發,有時候學多了很容易忘記最基礎的思想。

注:確有同感,早些年,無論是學c++,還是objective-c,又或是java,時間久了,用一些東西成習慣了,就不知道是啥意思了,所以得常反刍,才易消化。

就象學五筆,用五筆,N年之後,好多字不會拆,但常用的能打出來,其實是成了習慣了,而忘了規律。

再比如,你要教小孩子10以內的加減法,看看怎麼教才好,或者你還記得當時怎麼學的嗎?!

20以內的加減法呢?借10法和湊10法,你小時侯學過嗎?俺是沒學過,就是記住,那時沒人教這些個規律,加是正著數,減是倒著數等等,就是賣油翁,手熟爾。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved