| 網(wǎng)站首頁 | 關(guān)于我們 | 開發(fā)優(yōu)勢 | 產(chǎn)品展示 |
| 合作企業(yè) | 新聞動態(tài) | 聯(lián)系我們 | 電話聯(lián)系 |
文章作者:濟(jì)南軟件開發(fā) 時間:2016年12月20日
objective-c中非常重要的語法知識,在此歸納總結(jié)一下。
類方法,也稱靜態(tài)方法,指的是用static關(guān)鍵字修飾的方法。此方法屬類本身的方法,不屬于類的某一個實(shí)例(對象)。類方法中不可直接使用實(shí)例變量。其調(diào)用方式有三種:可直接調(diào)用、類名.方法名、對象名.方法名。實(shí)例方法指的是不用static關(guān)鍵字修飾的方法。每個實(shí)例對象都有自身的實(shí)例方法,互相獨(dú)立,不共享一個。其調(diào)用方式只能是對象名.方法名。
用修飾符static聲明的方法為靜態(tài)方法,不用修飾符static聲明的方法為實(shí)例方法。不管類生成或未生成對象,類的靜態(tài)方法都可以被使用,使用格式為:類名.靜態(tài)方法名。靜態(tài)方法只能使用該靜態(tài)方法所在類的靜態(tài)數(shù)據(jù)成員和靜態(tài)方法。這是因?yàn)槭褂渺o態(tài)方法時,該靜態(tài)方法所在類可能還沒有對象,即使有對象,由于用類名.靜態(tài)方法名方式調(diào)用靜態(tài)方法,靜態(tài)方法沒有this指針來存放對象的地址,無法判定應(yīng)訪問哪個對象的數(shù)據(jù)成員。在類創(chuàng)建對象后,實(shí)例方法才能被使用,使用格式為:對象名.實(shí)例方法名。實(shí)例方法可以使用該方法所在類的所有靜態(tài)成員和實(shí)例成員。
何時用靜態(tài)方法,何時用實(shí)例方法?
先說實(shí)例方法,當(dāng)你給一個類寫一個方法,如果該方法需要訪問某個實(shí)例的成員變量時,那么就將該方法定義成實(shí)例方法。一類的實(shí)例通常有一些成員變量,其中含有該實(shí)例的狀態(tài)信息。而該方法需要改變這些狀態(tài)。那么該方法需要聲明成實(shí)例方法。
靜態(tài)方法正好相反,它不需要訪問某個實(shí)例的成員變量,它不需要去改變某個實(shí)例的狀態(tài)。我們把該方法定義成靜態(tài)方法。
關(guān)于靜態(tài)方法和實(shí)例方法的一些誤區(qū)。
一、靜態(tài)方法常駐內(nèi)存,實(shí)例方法不是,所以靜態(tài)方法效率高但占內(nèi)存。
事實(shí)上,方法都是一樣的,在加載時機(jī)和占用內(nèi)存上,靜態(tài)方法和實(shí)例方法是一樣的,在類型第一次被使用時加載。調(diào)用的速度基本上沒有差別。
二、靜態(tài)方法在堆上分配內(nèi)存,實(shí)例方法在堆棧上。
事實(shí)上所有的方法都不可能在堆或者堆棧上分配內(nèi)存,方法作為代碼是被加載到特殊的代碼內(nèi)存區(qū)域,這個內(nèi)存區(qū)域是不可寫的。
三、實(shí)例方法需要先創(chuàng)建實(shí)例才可以調(diào)用,比較麻煩,靜態(tài)方法不用,比較簡單。
事實(shí)上如果一個方法與他所在類型的實(shí)例無關(guān),那么它就應(yīng)該是靜態(tài)的,決不會有人把它寫成實(shí)例方法。所以所有的實(shí)例方法都與實(shí)例有關(guān),既然與實(shí)例有關(guān),那么創(chuàng)建實(shí)例就是必然的步驟,沒有麻煩簡單一說。實(shí)際上上你可以把所有的實(shí)例方法都寫成靜態(tài)的,將實(shí)例作為參數(shù)傳入即可。
有些方法看似與所在的實(shí)例無關(guān),如IComparer.Compare方法,但實(shí)際上每一個實(shí)現(xiàn)這個接口的類都只會負(fù)責(zé)自己類型實(shí)例的比較,這是C#1.x規(guī)范中沒有泛型所帶來的歷史遺留問題。
大部分靜態(tài)方法是與類的實(shí)例有關(guān)的,如各種Parse方法,他做成靜態(tài)的原因是他沒有實(shí)例作為參數(shù)。其他的大多是出于語義或者其他目的的考慮。
第一種方式, 聲明實(shí)例,調(diào)用實(shí)例方法
當(dāng)一個類有多個實(shí)例,例如學(xué)生這個類,實(shí)例可以有學(xué)生甲,學(xué)生乙,學(xué)生丙,等等,我們就用第一種方式。在多線程的情況下,只要每個線程都創(chuàng)建自己的實(shí)例,那么第一種方法通常是線程安全的。
第二種方式,通過一個靜態(tài)的實(shí)例,去調(diào)用實(shí)例方法
這種情況比較特殊,通常是整個程序里該類唯一的一個實(shí)例,我們通過調(diào)用該實(shí)例的實(shí)例方法來改變該實(shí)例的某些狀態(tài)。這一個實(shí)例在多線程的情況下,通常是線程不安全的。除非我們給這個實(shí)例加鎖。防止其他線程訪問該實(shí)例。
第三種方式,直接調(diào)用靜態(tài)方法
這種情況下靜態(tài)方法不需要去改變某個實(shí)例的狀態(tài)。只要得到少量的參數(shù)就可完成既定事情。比如判斷一個文件是否存在,只要給個文件路徑和文件名,就能知道該文件是否存在。
轉(zhuǎn)載2:
調(diào)用一個類的靜態(tài)方法需不需要release?(內(nèi)存管理)(面試題)
我個人認(rèn)為,靜態(tài)成員方法不需要對象,不需要release。
注:其實(shí)靜態(tài)成員方法也是有對象的,叫做類對象,但這個是在第一次訪問類成員時觸發(fā)系統(tǒng)將其加載到內(nèi)存的,而且該類對象只在程序立閉時,才會釋放,并不由程序本身控制。
有三個概念要分清:類、實(shí)例和對象,類本身加載到內(nèi)存(可能是代碼段的內(nèi)存,不是堆內(nèi)存,也不是棧內(nèi)存),可以叫做一個對象;創(chuàng)建一個類的實(shí)例,這個實(shí)例可以叫做一個對象,所以就有類對象和實(shí)例對象之分了,類對象就是一張圖紙,實(shí)例對象是按類對象造出的一橦樓,確實(shí)都是實(shí)實(shí)在在存在的東西,所以叫對象,只不過性質(zhì)不同,一個是圖紙,一個是按圖紙?jiān)斐鰜淼臉欠俊?/p>
其實(shí),我也很想知道,這是哪家公司的面試題,搞得這么不嚴(yán)謹(jǐn)。
從這一句話中,可以有兩種理解,一是類的靜態(tài)方法中返回的對象是否需要release;二是調(diào)用實(shí)例方法需要release嗎?就是說要調(diào)用release,需要先alloc+init,這時才能調(diào)用實(shí)例對象的方法,使用完了,要release;那么直接調(diào)用類的靜態(tài)方法,是否需要release類本身的對象。
從以上分析,能得出這樣的結(jié)論:該公司剛接觸objectiv-c;該公司面試的人沒有真正熟練和掌握objective-c,也是剛?cè)腴T的家伙;最后,可能是面試的人說錯了,或此貼提問的人寫錯了。
轉(zhuǎn)載3:
這個好帖子我要馬克一下,今天碰到“靜態(tài)方法”一下子沒反應(yīng)過來,樓主你可幫了我大忙了,那句“靜態(tài)方法不需要release因?yàn)闆]有對象”也給了我啟發(fā),有時候?qū)W多了很容易忘記最基礎(chǔ)的思想。
注:確有同感,早些年,無論是學(xué)c++,還是objective-c,又或是java,時間久了,用一些東西成習(xí)慣了,就不知道是啥意思了,所以得常反芻,才易消化。
就象學(xué)五筆,用五筆,N年之后,好多字不會拆,但常用的能打出來,其實(shí)是成了習(xí)慣了,而忘了規(guī)律。
再比如,你要教小孩子10以內(nèi)的加減法,看看怎么教才好,或者你還記得當(dāng)時怎么學(xué)的嗎?!
20以內(nèi)的加減法呢?借10法和湊10法,你小時侯學(xué)過嗎?俺是沒學(xué)過,就是記住,那時沒人教這些個規(guī)律,加是正著數(shù),減是倒著數(shù)等等,就是賣油翁,手熟爾。
想要了解更多詳情歡迎來電咨詢18678812288
登陸網(wǎng)址:m.h6244.cn。
聯(lián)系人:王經(jīng)理。