1.Objective-C編程語言(第一周)
OC基本介紹及特性
?在C語言的基礎(chǔ)上做了面向?qū)ο蟮臄U(kuò)展斧抱;
通過LLVM編譯器架構(gòu)支持與swift語言雙向相互操作婿牍。
程序員的兩種思維方法
底層思維:向下,如何從機(jī)器底層理解對(duì)象構(gòu)造;包含語言構(gòu)造,編譯轉(zhuǎn)換,內(nèi)存模型卧抗,運(yùn)行時(shí)機(jī)制的理解。
抽象思維:向上鳖粟,把周圍世界抽象為有組織的工程代碼社裆;包含面向?qū)ο螅M件封裝向图,設(shè)計(jì)模式泳秀,架構(gòu)模式的理解。
“時(shí)空人”三位一體分析法:
對(duì)時(shí)間的分析:發(fā)生在什么時(shí)候张漂? compileTime or runTime?
對(duì)空間分析:在哪里晶默?stack or heap?
對(duì)人物的分析:代碼從哪里來?programmer or compiler/runtime/framework
類和結(jié)構(gòu)的區(qū)別
類-引用類型
? ? 位于棧上的指針+位于堆上的對(duì)象航攒;
結(jié)構(gòu)-值類型
? ? 位于棧上的值
棧(stack)和堆(heap)的區(qū)別
棧:存儲(chǔ)值類型
? ? ? 1.無ARC負(fù)擔(dān)磺陡,由系統(tǒng)自動(dòng)管理,以執(zhí)行函數(shù)為單位漠畜;
? ? ? 2.空間大小在編譯時(shí)確定(參數(shù)+局部變量)
? ? ? 3.函數(shù)執(zhí)行時(shí)币他,系統(tǒng)自動(dòng)分配分配一個(gè)stack
? ? ? 4.函數(shù)執(zhí)行結(jié)束,系統(tǒng)自動(dòng)回收stack
? ? ? 5.函數(shù)之間通過拷貝值傳遞
? ? ? 6.具有局部性憔狞,大小由限額蝴悉,超過會(huì)stack overflow
堆:存儲(chǔ)引用類型對(duì)象
? ? ? ?1.分配由程序員手動(dòng)請(qǐng)求(創(chuàng)建對(duì)象時(shí))
? ? ? ? 2.釋放由運(yùn)行時(shí)ARC機(jī)制自動(dòng)釋放(確定時(shí))
? ? ? ? 3.函數(shù)之間通過拷貝引用(指針)傳遞
? ? ? ? 4.具有全局性,總體大小無限制(受制于系統(tǒng)內(nèi)存大旭摇)
屬性(property)
編譯器會(huì)為屬性propertyName自動(dòng)合成以下三個(gè)東西:
getter訪問器方法:propertyName;
setter訪問器方法:setPropertyName;
實(shí)例變量:_propertyName;
屬性的描述特性
1.讀寫特性(readonly/readwrite)
2.內(nèi)存管理特性(strong/weak/copy)
3.多線程特性(atomic/nonatomic)
實(shí)例變量
跟隨對(duì)象實(shí)例存儲(chǔ)在堆上拍冠;
值類型實(shí)例變量直接“內(nèi)嵌”在對(duì)象實(shí)例中尿这,跟隨對(duì)象實(shí)例的內(nèi)存釋放而釋放;
引用型實(shí)例變量通過指針引用堆上的引用類型實(shí)例庆杜,ARC針對(duì)引用進(jìn)行計(jì)數(shù)管理射众,釋放引用計(jì)數(shù)為0的對(duì)象。
方法
OC里面的方法調(diào)用可以看做是向?qū)ο蟀l(fā)送消息晃财;
在編譯時(shí)叨橱,對(duì)象的頭部有一個(gè)指針指向Class,里面有個(gè)存儲(chǔ)方法列表地址的指針(methodLists),對(duì)象的所有方法的入口點(diǎn)地址都在此指針指向的方法列表上断盛。
因此罗洗,實(shí)例方法的動(dòng)態(tài)調(diào)用機(jī)制可以讓實(shí)例在調(diào)用方法時(shí),可以不關(guān)注其申明的類型钢猛,只要實(shí)例實(shí)際的類型包含了該方法即可伙菜。
動(dòng)態(tài)調(diào)用的方式由于尋址方式有三步,因此性能會(huì)略有下降厢洞。
實(shí)例方法:表達(dá)的是實(shí)例的行為仇让,可訪問實(shí)例成員、類型方法躺翻、靜態(tài)變量;
方法參數(shù):第一個(gè)參數(shù)名包含在函數(shù)名中卫玖,第二個(gè)參數(shù)名開始公你,需要顯式申明,并且參數(shù)名不同代表的方法不同假瞬。
類方法:表達(dá)類型行為陕靠,只可以訪問類型方法、靜態(tài)變量脱茉;不能訪問實(shí)例成員剪芥。
初始化器和析構(gòu)器
對(duì)象初始化器:常用形式-(id)[[ * alloc]init]?
alloc:1.在堆上分配內(nèi)存;2.將屬性或?qū)嵗兞康膬?nèi)存置0琴许;
init:1.先調(diào)用父類的初始化器[super init]税肪;2.初始化當(dāng)前對(duì)象的實(shí)例變量;
new相當(dāng)于調(diào)用alloc/init的無參數(shù)版本
類型初始化器 +(void)initalize 在每個(gè)類使用前被系統(tǒng)自動(dòng)調(diào)用榜田;
子類的initialise會(huì)自動(dòng)調(diào)用父類的益兄;
對(duì)象析構(gòu)器:-(void)dealloc ?負(fù)責(zé)釋放對(duì)象擁有的動(dòng)態(tài)資源
? ? ? ? ? ? ? ? ? ? 1.ARC將對(duì)象屬性引用計(jì)數(shù)減持;--系統(tǒng)自動(dòng)
? ? ? ? ? ? ? ? ? ? 2.釋放不受ARC管理的動(dòng)態(tài)內(nèi)存箭券;--手動(dòng)
? ? ? ? ? ? ? ? ? ? ?3.關(guān)閉非內(nèi)存資源净捅,如文件句柄,網(wǎng)絡(luò)端口--手動(dòng)
繼承與多態(tài)
面向?qū)ο蟮娜齻€(gè)特性:封裝辩块、繼承蛔六、多態(tài)荆永;
每個(gè)類只能有1個(gè)基類;
繼承的兩層含義:1国章、成員復(fù)用 ? ?子類復(fù)用父類的所有成員具钥;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2、類型抽象 ? 將子類當(dāng)做父類來使用(IS-A關(guān)系)
子類中可以找到與父類一樣的內(nèi)存段捉腥。子類新增的屬性和方法氓拼,都在父類所占堆相同內(nèi)存段的后面添加。
多態(tài):運(yùn)行時(shí)多態(tài)抵碟,同一個(gè)方法桃漾,實(shí)例對(duì)象不同有不同的實(shí)現(xiàn)方法。在運(yùn)行時(shí)拟逮,根據(jù)實(shí)例類型的不同撬统,調(diào)用相應(yīng)的實(shí)例方法。
子類中重寫父類的方法(同名同參)敦迄。
在子類的代碼中恋追,可以使用super來調(diào)用父類的實(shí)現(xiàn)。
? ? ?self具有多態(tài)性罚屋;super不具有多態(tài)性苦囱;
避免在init和dealloc中使用子類重寫的方法。