1、區(qū)別:
靜態(tài)方法在程序開始時生成內(nèi)存,實例方法在程序運行中生成內(nèi)存器瘪,
所以靜態(tài)方法可以直接調(diào)用,實例方法要先成生實例,通過實例調(diào)用方法汤善,靜態(tài)速度很快,但是多了會占內(nèi)存牧愁。
靜態(tài)內(nèi)存是連續(xù)的,因為是在程序開始時就生成了,而實例申請的是離散的空間,所以當然沒有靜態(tài)方法快素邪,
而且靜態(tài)內(nèi)存是有限制的,太多了程序會啟動不了猪半。
2兔朦、使用場景:
如果需要訪問或者修改某個實例的成員變量時,將該方法定義成實例方法磨确。
類方法正好相反沽甥,它不需要訪問或者修改某個實例的成員變量。
類方法一般用于實現(xiàn)一些工具方法乏奥,比如對某個對象進行擴展摆舟,或者實現(xiàn)單例。
類方法常駐內(nèi)存,實例方法不是恨诱,所以類方法效率高但占內(nèi)存歇式。
類方法在堆上分配內(nèi)存,實例方法在堆棧上胡野。
事實上所有的方法都不可能在堆或者堆棧上分配內(nèi)存,方法作為代碼是被加載到特殊的代碼內(nèi)存區(qū)域痕鳍,這個內(nèi)存區(qū)域是不可寫的硫豆。
實例方法需要先創(chuàng)建實例才可以調(diào)用,比較麻煩笼呆,類方法不用熊响,比較簡單。
事實上如果一個方法與他所在類型的實例無關诗赌,那么它就應該是靜態(tài)的汗茄,決不會有人把它寫成實例方法。所以所有的實例方法都與實例有關铭若,既然與實例有關洪碳,那么創(chuàng)建實例就是必然的步驟,沒有麻煩簡單一說叼屠。實際上上你可以把所有的實例方法都寫成靜態(tài)的瞳腌,將實例作為參數(shù)傳入即可。
類方法镜雨,也稱靜態(tài)方法嫂侍,在C++中指的是用static關鍵字修飾的方法,而在OC里就是+方法荚坞,在Swift里是class func挑宠。
此方法屬類本身的方法,不屬于類的某一個實例(對象)颓影。
類方法中不可直接使用實例變量各淀,
在C++中其調(diào)用方式有三種:可直接調(diào)用、類名.方法名诡挂、對象名.方法名揪阿,
在OC中是不需要alloc一個新的對象,直接用類名調(diào)用咆畏,
Swift中直接類名.方法南捂。
實例方法,在C++中指的是不用static關鍵字修飾的方法旧找,OC中是-方法溺健,Swift中就是普通的func。 每個實例對象都有自身的實例方法,互相獨立鞭缭,不共享一個剖膳。
在C++中其調(diào)用方式只能是對象名.方法名。
在OC里是需要alloc一個對象岭辣,然后調(diào)用吱晒。
在Swift中也是需要對象.方法。
Objective-C里面既有實例方法也類方法沦童。類方法(Class Method) 有時被稱為工廠方法(Factory Method)或者方便方法(Convenience method)仑濒。工廠方法的稱謂明顯和一般意義上的工廠方法不同,從本質(zhì)上來說偷遗,類方法可以獨立于對象而執(zhí)行墩瞳,所以在其他的語言里面類方法有的時候被稱為靜態(tài)方法。
注意點一:類方法
1氏豌,類方法可以調(diào)用類方法喉酌。
2汰具,類方法不可以調(diào)用實例方法乡括,但是類方法可以通過創(chuàng)建對象來訪問實例方法。
3懦鼠,類方法不可以使用實例變量纪铺。類方法可以使用self歪架,因為self不是實例變量。
4霹陡,類方法作為消息和蚪,可以被發(fā)送到類或者對象里面去(實際上,就是可以通過類或者對象調(diào)用類方法的意思)烹棉。
注意點二:self的規(guī)則
大家需要記住下面的規(guī)則:
1攒霹,實例方法里面的self,是對象的首地址浆洗。
2催束,類方法里面的self,是Class.
盡管在同一個類里面的使用self伏社,但是self卻有著不同的解讀抠刺。
在類方法里面的self,可以翻譯成class self摘昌;在實例方法里面的self速妖,應該被翻譯成為object self。
在類方法里面的self和實例方法里面的self有著本質(zhì)上的不同聪黎,盡管他們的名字都叫self罕容。
類方法創(chuàng)造的對象要不要用release釋放?
答: 不需要 這個對象被放到自動釋放池中,在ARC中已經(jīng)不需要考慮這個問題了
Object-C中的私有方法和私有成員變量
成員變量默認對內(nèi)是共有的锦秒,對外是私有的露泊。
原文:https://blog.csdn.net/youshaoduo/article/details/55253041