OC語言基本概念

基本概念

  • oc面向?qū)ο笳Z言,只需關(guān)注具有相關(guān)功能的對象,不必親力親為。
  • oc面向?qū)ο蟮娜筇匦裕悍庋b、繼承(拷貝一份父類的方法屬性成員變量,方法可重寫,屬性成員變量不可。繼承就擁有,擁有的成員變量不一定可訪問)、多態(tài)(多種表現(xiàn)形態(tài),代碼表現(xiàn)為父類指針指向子類對象,運行時判斷真實類型,調(diào)用子類方法)
  • 繼承:繼承父類的子類.m無法通過下劃線直接調(diào)用父類的私有變量,需要調(diào)用self的getter方法,本質(zhì)會去調(diào)用父類此變量的getter方法。若父類變量為成員變量,子類在.m中也可訪問(看修飾符)
  • 源文件: .h .m .mm(oc與c++混編) ,快捷鍵:command + control + ↑切換.h.m。
  • 類:方法屬性的集合,也是一個對象,本質(zhì)是結(jié)構(gòu)體
  • 對象:實例對象其地址為第0個屬性isa的地址,實例對象創(chuàng)建時系統(tǒng)會自動創(chuàng)建類對象,其中包含當(dāng)前實例對象的所有方法。繼承與NSObject的對象需要內(nèi)存管理,對象存放在堆。
  • 匿名對象:[Person new] (開辟存貯空間,初始化屬性,返回指針地址)
  • 成員變量(屬性、實例變量):寫在類聲明中的{}中的變量,只可通過對象訪問,離開類不是成員變量。不能在定義的同時進行初始化。不可用static修飾。存貯于當(dāng)前對象對應(yīng)的堆的存儲空間中(需手動釋放)。
  • 成員變量修飾符:在類聲明中{}內(nèi)的即是成員變量@public:可以在其他類p-->_age、本類_age、子類_age中訪問;@private可以在本類訪問,不可以在其他類、子類中訪問,子類不可訪問即是繼承即擁有父類的成員變量,擁有但是不可訪問,均提示錯誤;@protected可以在本類、子類中訪問,不可以在其他類訪問;默認是此修飾符@package在當(dāng)前代碼所在的包中訪問等于public,在其他包中訪問等于private。
  • 私有變量:寫在@implementation中的{}的成員變量,就是私有的成員變量,其他類無法查看訪問(區(qū)別于成員變量使用@private修飾,雖然私有,但是其他類是可以可查看的。而私有變量完全私有,其它類無法通過指針p-->_age查看。由此@property生成的變量屬于私有變量)
  • 局部變量:寫在函數(shù)或者代碼塊中的變量。存貯于棧中(離開作用域系統(tǒng)釋放),作用域至大括號或者return。
  • 全局變量:寫在函數(shù)和大括號外的變量。作用域從定義的那一行至文件末尾。存儲于靜態(tài)區(qū)(程序啟動就會分配存貯空間,直到程序結(jié)束才會釋放)
  • 私有方法:只有實現(xiàn),沒有聲明。也可調(diào)用,沒有真正的私有方法(id定義類對象或performSelector)
  • 構(gòu)造方法:以init開頭的方法,可自定義構(gòu)造方法(對象方法,instancetype,initW)。重寫構(gòu)造方法先初始化父類,返回子類對象地址,在設(shè)置子類屬性,返回self。
  • 類工廠方法:分配初始化實例,返回一個自己實例的類方法,用于快速創(chuàng)建對象。(類方法,以類名稱開頭,首字母小寫,instancetype)自定義類工廠方法是蘋果的一個規(guī)范,創(chuàng)建對象往往有對應(yīng)的自定義構(gòu)造方法和自定義類工廠方法。
  • 分類:(類別,類目)不修改原類的基礎(chǔ)上為類修改一些方法。不能擴充成員變量,而@property只會生成getter/setter方法聲明,不會生成實現(xiàn)及私有變量??稍谠诜诸愔性L問原類.h中的屬性。分類方法會覆蓋原有類的方法。多個分類方法覆蓋原方法,會執(zhí)行最后一個參與編譯的分類中的方法。
  • 匿名分類:(延展類別,類擴展)為某個類擴充一些私有的屬性和方法。無別名,可以擴充屬性。
  • 協(xié)議:只可聲明方法。@interface PersonProtocol<NSObject>協(xié)議遵守其它協(xié)議,就會有父協(xié)議的方法。對具有功能的對象進行限制:id<PersonProtocol>delegate;
  • 代理:設(shè)計模式是一種編碼經(jīng)驗,使代碼編制工程化。應(yīng)用:當(dāng)A對象想要監(jiān)聽B對象的變化;B對象發(fā)生一些變化,想要通知A對象;當(dāng)對象B無法處理某些行為的時候,想讓對象A處理,A即是B對象的代理對象。
  • 淺拷貝:不可變對象copy,不會生成新對象。
  • 深拷貝:一般是深拷貝,會生成新對象。
  • 動態(tài)數(shù)據(jù)類型:id(NSObject * 靜態(tài)數(shù)據(jù)類型,萬能指針),即父類指針指向子類對象,調(diào)用子類(真實類型)特有方法,通過動態(tài)數(shù)據(jù)類型調(diào)用(多態(tài),避免強轉(zhuǎn))。也可調(diào)用真實類型的私有方法,在運行時知道對象的真實類型。調(diào)用不屬于自己真實類型的方法編譯時不會報錯,導(dǎo)致運行時錯誤,為避免,可用iskindofclass等。
  • 野指針:對象被釋放了成為僵尸對象,指向僵尸對象的指針。
  • MRC:Manul Referance Counting 引用計數(shù)retaincount為0時調(diào)用對象的dealloc方法。MRC轉(zhuǎn)ARC:buildsetting- automatic r,edit convert to object arc;文件轉(zhuǎn)換:targets-buildpases-compilesources(參與編譯的文件順序)--fno-object-arc。
  • ARC:Automatic Referance Counting 是編譯器特性,不是運行時特性,與其他語言中的垃圾回收機制有本質(zhì)區(qū)別。只要有一個強指針(默認都是強)指向?qū)ο?,對象就不會釋放。assign分為assign對基本數(shù)據(jù)類型,weak對對象類型,如代理delegate。
  • 點語法:是編譯器的特性,會在程序翻譯成二進制的時候?qū)Ⅻc語法自動換回getter/setter方法。
  • 內(nèi)存泄漏:如果程序運行時一直分配內(nèi)存而不及時釋放無用的內(nèi)存,程序占用的內(nèi)存越來越大,直到把系統(tǒng)分配給該APP的內(nèi)存消耗殫盡,程序因無內(nèi)存可用導(dǎo)致崩潰。
  • 內(nèi)存管理:MRC:一次alloc,retain 以及 copy中淺拷貝,對應(yīng)一次release。深拷貝,生成新對象,系統(tǒng)不會對以前的對象retain,所以對新對象和原對象分別release。對象添加到數(shù)組,對象會retain,數(shù)組remove或者數(shù)組release,會對此對象release。
  • 循環(huán)引用:A對象擁有B對象,B擁有A。ARC:一邊strong,一邊weak。MRC:一邊retain,一邊assign,使用assign不需要對其擁有的此對象release。
  • 強制類型轉(zhuǎn)換:實際是創(chuàng)建了一個新的結(jié)構(gòu)體,賦值給左邊。d1 = (Date){1990,1,15}結(jié)構(gòu)體Date d2 = d1,修改d2不會影響d1
  • SEL:每個方法都有與之對應(yīng)的SEL類型的對象,根據(jù)SEL對象就可以找到方法的地址,進而調(diào)用方法。根據(jù)對象方法名包裝成為SEL類型的數(shù)據(jù),根據(jù)此數(shù)據(jù)到該類的類對象去找相應(yīng)的方法。配合對象類調(diào)用方法,判斷方法是否實現(xiàn)。

關(guān)鍵字

  • @property int age;會為屬性_age生成getter/setter方法的聲明(xcode4.5之前,之后會自動生成聲明和實現(xiàn),set方法傳入值默認賦值給_age),編譯器指令。會生成私有變量:生成的變量在@implementation中為私有變量,無論如何修飾皆為私有。子類無法直接訪問。若同時重寫getter/setter方法的實現(xiàn),不會自動生成私有變量?;蛘遰eadonly修飾而又重寫getter也不會生成。默認修飾符readwrite,assign,atomic。
  • @synthesize age = _age;實現(xiàn)age的set方法,把形參age賦值給_age。若不寫,默認賦值給age成員變量, _age無值。在沒有該私有變量情況也會生成私有變量。 在Xcode4.5及以后的版本中,可以省略@synthesize,編譯器會自動幫你加上get 和 set 方法的實現(xiàn),并且默認會去訪問_age這個成員變量,如果找不到_age這個成員變量,會自動生成一個叫做 _age的私有成員變量。
  • @class僅僅是告訴編譯器,后面是一個類。作用:減小修改低層對上層(#import預(yù)編譯,拷貝一份)的影響,提高編譯效率。另相互拷貝情況下,若寫一個還會造成重復(fù)拷貝。所以相互拷貝的2個類都需聲明。
  • @autoreleasepool 只能只要在自動釋放池調(diào)用autorelease,才能將對象放入自動釋放池,多個自動釋放池可嵌套。
  • @dynamic是告訴編譯器屬性會在運行時實現(xiàn)getter/setter方法。

其它

  • instancetype: 在編譯時可以知道真實類型,調(diào)用非自己的方法報警告。只能作為返回值。類似區(qū)別于id可以作為參數(shù),定義數(shù)據(jù)類型,編譯時不知道類型。
  • %@打印對象會調(diào)用-開頭的description,返回<類名稱: 對象地址>.打印類對象會調(diào)用+開頭的description方法。本質(zhì)打印字符串,可重寫打印需要內(nèi)容,其中盡量不要使用self獲取成員變量,因其中再次打印self造成死循環(huán)。
  • NsLog自動換行,對C語言支持不好(char *s = "我的",#import自動防止重復(fù)拷貝,避免書寫頭文件衛(wèi)士)
  • MRC下set方法流程:1,A對象使用B對象,對B對象進行retain,這樣保證A對象存在B就存在。2,A對象釋放需要對B對象進行release,防止內(nèi)存泄漏,例如人對房子release。(dealloc中使用self.room = nil,對擁有的房間進行釋放,防止野指針錯誤)3,人換房,重新賦值需要對以前的對象release,防止以前擁有的未釋放。4,重復(fù)賦值導(dǎo)致僵尸對象及野指針retain發(fā)生錯誤。if(_room != room) [_room release],_room = [room retain].
  • copyWithZone會根據(jù)第一次傳入的zone向上初始化,即是可以self= [super copyWithZone:zone],子類指針指向父類對象。
  • 相關(guān)視頻:1.11,12,13==2.03練習(xí)2,4,13,14,15==3.4==4.16,18==5.06,07,09,11==8.15==閱讀項目文檔,修改項目模板,自定義快捷鍵,signleton單例
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容