基本概念
- oc面向?qū)ο笳Z(yǔ)言,只需關(guān)注具有相關(guān)功能的對(duì)象待错,不必親力親為。
- oc面向?qū)ο蟮娜筇匦裕悍庋b皂林、繼承(拷貝一份父類的方法屬性成員變量朗鸠,方法可重寫,屬性成員變量不可础倍。繼承就擁有,擁有的成員變量不一定可訪問(wèn))胎挎、多態(tài)(多種表現(xiàn)形態(tài)沟启,代碼表現(xiàn)為父類指針指向子類對(duì)象,運(yùn)行時(shí)判斷真實(shí)類型犹菇,調(diào)用子類方法)
- 繼承:繼承父類的子類.m無(wú)法通過(guò)下劃線直接調(diào)用父類的私有變量德迹,需要調(diào)用self的getter方法,本質(zhì)會(huì)去調(diào)用父類此變量的getter方法揭芍。若父類變量為成員變量胳搞,子類在.m中也可訪問(wèn)(看修飾符)
- 源文件: .h .m .mm(oc與c++混編) ,快捷鍵:command + control + ↑切換.h.m称杨。
- 類:方法屬性的集合,也是一個(gè)對(duì)象肌毅,本質(zhì)是結(jié)構(gòu)體
- 對(duì)象:實(shí)例對(duì)象其地址為第0個(gè)屬性isa的地址,實(shí)例對(duì)象創(chuàng)建時(shí)系統(tǒng)會(huì)自動(dòng)創(chuàng)建類對(duì)象姑原,其中包含當(dāng)前實(shí)例對(duì)象的所有方法悬而。繼承與NSObject的對(duì)象需要內(nèi)存管理,對(duì)象存放在堆锭汛。
- 匿名對(duì)象:[Person new] (開(kāi)辟存貯空間笨奠,初始化屬性,返回指針地址)
- 成員變量(屬性唤殴、實(shí)例變量):寫在類聲明中的{}中的變量般婆,只可通過(guò)對(duì)象訪問(wèn),離開(kāi)類不是成員變量朵逝。不能在定義的同時(shí)進(jìn)行初始化蔚袍。不可用static修飾。存貯于當(dāng)前對(duì)象對(duì)應(yīng)的堆的存儲(chǔ)空間中(需手動(dòng)釋放)廉侧。
- 成員變量修飾符:在類聲明中{}內(nèi)的即是成員變量@public:可以在其他類p-->_age页响、本類_age篓足、子類_age中訪問(wèn);@private可以在本類訪問(wèn)闰蚕,不可以在其他類栈拖、子類中訪問(wèn),子類不可訪問(wèn)即是繼承即擁有父類的成員變量没陡,擁有但是不可訪問(wèn)涩哟,均提示錯(cuò)誤;@protected可以在本類盼玄、子類中訪問(wèn)贴彼,不可以在其他類訪問(wèn);默認(rèn)是此修飾符@package在當(dāng)前代碼所在的包中訪問(wèn)等于public埃儿,在其他包中訪問(wèn)等于private器仗。
- 私有變量:寫在@implementation中的{}的成員變量,就是私有的成員變量童番,其他類無(wú)法查看訪問(wèn)(區(qū)別于成員變量使用@private修飾精钮,雖然私有,但是其他類是可以可查看的剃斧。而私有變量完全私有轨香,其它類無(wú)法通過(guò)指針p-->_age查看。由此@property生成的變量屬于私有變量)
- 局部變量:寫在函數(shù)或者代碼塊中的變量幼东。存貯于棧中(離開(kāi)作用域系統(tǒng)釋放)臂容,作用域至大括號(hào)或者return。
- 全局變量:寫在函數(shù)和大括號(hào)外的變量根蟹。作用域從定義的那一行至文件末尾脓杉。存儲(chǔ)于靜態(tài)區(qū)(程序啟動(dòng)就會(huì)分配存貯空間,直到程序結(jié)束才會(huì)釋放)
- 私有方法:只有實(shí)現(xiàn)娜亿,沒(méi)有聲明丽已。也可調(diào)用,沒(méi)有真正的私有方法(id定義類對(duì)象或performSelector)
- 構(gòu)造方法:以init開(kāi)頭的方法买决,可自定義構(gòu)造方法(對(duì)象方法沛婴,instancetype,initW)督赤。重寫構(gòu)造方法先初始化父類嘁灯,返回子類對(duì)象地址,在設(shè)置子類屬性躲舌,返回self丑婿。
- 類工廠方法:分配初始化實(shí)例,返回一個(gè)自己實(shí)例的類方法,用于快速創(chuàng)建對(duì)象羹奉。(類方法秒旋,以類名稱開(kāi)頭,首字母小寫诀拭,instancetype)自定義類工廠方法是蘋果的一個(gè)規(guī)范迁筛,創(chuàng)建對(duì)象往往有對(duì)應(yīng)的自定義構(gòu)造方法和自定義類工廠方法。
- 分類:(類別耕挨,類目)不修改原類的基礎(chǔ)上為類修改一些方法细卧。不能擴(kuò)充成員變量,而@property只會(huì)生成getter/setter方法聲明筒占,不會(huì)生成實(shí)現(xiàn)及私有變量贪庙。可在在分類中訪問(wèn)原類.h中的屬性翰苫。分類方法會(huì)覆蓋原有類的方法止邮。多個(gè)分類方法覆蓋原方法,會(huì)執(zhí)行最后一個(gè)參與編譯的分類中的方法奏窑。
- 匿名分類:(延展類別农尖,類擴(kuò)展)為某個(gè)類擴(kuò)充一些私有的屬性和方法。無(wú)別名良哲,可以擴(kuò)充屬性。
- 協(xié)議:只可聲明方法助隧。@interface PersonProtocol<NSObject>協(xié)議遵守其它協(xié)議筑凫,就會(huì)有父協(xié)議的方法。對(duì)具有功能的對(duì)象進(jìn)行限制:id<PersonProtocol>delegate;
- 代理:設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn)并村,使代碼編制工程化巍实。應(yīng)用:當(dāng)A對(duì)象想要監(jiān)聽(tīng)B對(duì)象的變化;B對(duì)象發(fā)生一些變化哩牍,想要通知A對(duì)象棚潦;當(dāng)對(duì)象B無(wú)法處理某些行為的時(shí)候,想讓對(duì)象A處理膝昆,A即是B對(duì)象的代理對(duì)象丸边。
- 淺拷貝:不可變對(duì)象copy,不會(huì)生成新對(duì)象荚孵。
- 深拷貝:一般是深拷貝妹窖,會(huì)生成新對(duì)象。
- 動(dòng)態(tài)數(shù)據(jù)類型:id(NSObject * 靜態(tài)數(shù)據(jù)類型收叶,萬(wàn)能指針)骄呼,即父類指針指向子類對(duì)象,調(diào)用子類(真實(shí)類型)特有方法,通過(guò)動(dòng)態(tài)數(shù)據(jù)類型調(diào)用(多態(tài)蜓萄,避免強(qiáng)轉(zhuǎn))隅茎。也可調(diào)用真實(shí)類型的私有方法,在運(yùn)行時(shí)知道對(duì)象的真實(shí)類型嫉沽。調(diào)用不屬于自己真實(shí)類型的方法編譯時(shí)不會(huì)報(bào)錯(cuò)辟犀,導(dǎo)致運(yùn)行時(shí)錯(cuò)誤,為避免耻蛇,可用iskindofclass等踪蹬。
- 野指針:對(duì)象被釋放了成為僵尸對(duì)象,指向僵尸對(duì)象的指針臣咖。
- MRC:Manul Referance Counting 引用計(jì)數(shù)retaincount為0時(shí)調(diào)用對(duì)象的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 是編譯器特性,不是運(yùn)行時(shí)特性刁赦,與其他語(yǔ)言中的垃圾回收機(jī)制有本質(zhì)區(qū)別娶聘。只要有一個(gè)強(qiáng)指針(默認(rèn)都是強(qiáng))指向?qū)ο螅瑢?duì)象就不會(huì)釋放甚脉。assign分為assign對(duì)基本數(shù)據(jù)類型丸升,weak對(duì)對(duì)象類型,如代理delegate牺氨。
- 點(diǎn)語(yǔ)法:是編譯器的特性狡耻,會(huì)在程序翻譯成二進(jìn)制的時(shí)候?qū)Ⅻc(diǎn)語(yǔ)法自動(dòng)換回getter/setter方法。
- 內(nèi)存泄漏:如果程序運(yùn)行時(shí)一直分配內(nèi)存而不及時(shí)釋放無(wú)用的內(nèi)存猴凹,程序占用的內(nèi)存越來(lái)越大夷狰,直到把系統(tǒng)分配給該APP的內(nèi)存消耗殫盡,程序因無(wú)內(nèi)存可用導(dǎo)致崩潰郊霎。
- 內(nèi)存管理:MRC:一次alloc沼头,retain 以及 copy中淺拷貝,對(duì)應(yīng)一次release书劝。深拷貝进倍,生成新對(duì)象,系統(tǒng)不會(huì)對(duì)以前的對(duì)象retain庄撮,所以對(duì)新對(duì)象和原對(duì)象分別release背捌。對(duì)象添加到數(shù)組,對(duì)象會(huì)retain洞斯,數(shù)組remove或者數(shù)組release毡庆,會(huì)對(duì)此對(duì)象release坑赡。
- 循環(huán)引用:A對(duì)象擁有B對(duì)象,B擁有A么抗。ARC:一邊strong毅否,一邊weak。MRC:一邊retain蝇刀,一邊assign螟加,使用assign不需要對(duì)其擁有的此對(duì)象release。
- 強(qiáng)制類型轉(zhuǎn)換:實(shí)際是創(chuàng)建了一個(gè)新的結(jié)構(gòu)體吞琐,賦值給左邊捆探。d1 = (Date){1990,1,15}結(jié)構(gòu)體Date d2 = d1,修改d2不會(huì)影響d1
- SEL:每個(gè)方法都有與之對(duì)應(yīng)的SEL類型的對(duì)象,根據(jù)SEL對(duì)象就可以找到方法的地址站粟,進(jìn)而調(diào)用方法黍图。根據(jù)對(duì)象方法名包裝成為SEL類型的數(shù)據(jù),根據(jù)此數(shù)據(jù)到該類的類對(duì)象去找相應(yīng)的方法奴烙。配合對(duì)象類調(diào)用方法助被,判斷方法是否實(shí)現(xiàn)。
關(guān)鍵字
- @property int age切诀;會(huì)為屬性_age生成getter/setter方法的聲明(xcode4.5之前揩环,之后會(huì)自動(dòng)生成聲明和實(shí)現(xiàn),set方法傳入值默認(rèn)賦值給_age)幅虑,編譯器指令丰滑。會(huì)生成私有變量:生成的變量在@implementation中為私有變量,無(wú)論如何修飾皆為私有倒庵。子類無(wú)法直接訪問(wèn)吨枉。若同時(shí)重寫getter/setter方法的實(shí)現(xiàn),不會(huì)自動(dòng)生成私有變量哄芜。或者readonly修飾而又重寫getter也不會(huì)生成柬唯。默認(rèn)修飾符readwrite认臊,assign,atomic锄奢。
- @synthesize age = _age失晴;實(shí)現(xiàn)age的set方法,把形參age賦值給_age拘央。若不寫涂屁,默認(rèn)賦值給age成員變量, _age無(wú)值灰伟。在沒(méi)有該私有變量情況也會(huì)生成私有變量拆又。 在Xcode4.5及以后的版本中儒旬,可以省略@synthesize,編譯器會(huì)自動(dòng)幫你加上get 和 set 方法的實(shí)現(xiàn)帖族,并且默認(rèn)會(huì)去訪問(wèn)_age這個(gè)成員變量栈源,如果找不到_age這個(gè)成員變量,會(huì)自動(dòng)生成一個(gè)叫做 _age的私有成員變量竖般。
- @class僅僅是告訴編譯器甚垦,后面是一個(gè)類。作用:減小修改低層對(duì)上層(#import預(yù)編譯涣雕,拷貝一份)的影響艰亮,提高編譯效率。另相互拷貝情況下挣郭,若寫一個(gè)還會(huì)造成重復(fù)拷貝迄埃。所以相互拷貝的2個(gè)類都需聲明。
- @autoreleasepool 只能只要在自動(dòng)釋放池調(diào)用autorelease丈屹,才能將對(duì)象放入自動(dòng)釋放池调俘,多個(gè)自動(dòng)釋放池可嵌套。
- @dynamic是告訴編譯器屬性會(huì)在運(yùn)行時(shí)實(shí)現(xiàn)getter/setter方法旺垒。
其它
- instancetype: 在編譯時(shí)可以知道真實(shí)類型彩库,調(diào)用非自己的方法報(bào)警告。只能作為返回值先蒋。類似區(qū)別于id可以作為參數(shù)骇钦,定義數(shù)據(jù)類型,編譯時(shí)不知道類型竞漾。
- %@打印對(duì)象會(huì)調(diào)用-開(kāi)頭的description眯搭,返回<類名稱: 對(duì)象地址>.打印類對(duì)象會(huì)調(diào)用+開(kāi)頭的description方法。本質(zhì)打印字符串业岁,可重寫打印需要內(nèi)容鳞仙,其中盡量不要使用self獲取成員變量,因其中再次打印self造成死循環(huán)笔时。
- NsLog自動(dòng)換行棍好,對(duì)C語(yǔ)言支持不好(char *s = "我的",#import自動(dòng)防止重復(fù)拷貝允耿,避免書寫頭文件衛(wèi)士)
- MRC下set方法流程:1借笙,A對(duì)象使用B對(duì)象,對(duì)B對(duì)象進(jìn)行retain较锡,這樣保證A對(duì)象存在B就存在业稼。2,A對(duì)象釋放需要對(duì)B對(duì)象進(jìn)行release蚂蕴,防止內(nèi)存泄漏低散,例如人對(duì)房子release俯邓。(dealloc中使用self.room = nil,對(duì)擁有的房間進(jìn)行釋放,防止野指針錯(cuò)誤)3谦纱,人換房看成,重新賦值需要對(duì)以前的對(duì)象release,防止以前擁有的未釋放跨嘉。4川慌,重復(fù)賦值導(dǎo)致僵尸對(duì)象及野指針retain發(fā)生錯(cuò)誤。if(_room != room) [_room release],_room = [room retain].
- copyWithZone會(huì)根據(jù)第一次傳入的zone向上初始化祠乃,即是可以self= [super copyWithZone:zone],子類指針指向父類對(duì)象梦重。
- 相關(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==閱讀項(xiàng)目文檔琴拧,修改項(xiàng)目模板,自定義快捷鍵嘱支,signleton單例