對(duì)面向?qū)ο蠛?jiǎn)單的理解

面向?qū)ο缶幊?即OOP,是一種編程范式,滿足面向?qū)ο缶幊痰恼Z(yǔ)言,一般會(huì)提供類、 封裝、繼承等語(yǔ)法和概念來(lái)輔助我們進(jìn)行面向?qū)ο缶幊獭?br> 面向?qū)ο笫腔谌f(wàn)物皆對(duì)象這個(gè)哲學(xué)觀點(diǎn). 所謂的面向?qū)ο缶褪菍⑽覀兊某绦蚰K化, 對(duì)象化,把具體事物的特性屬性和通過(guò)這些屬性來(lái)實(shí)現(xiàn)一些動(dòng)作的具體方法放到一個(gè)類 里面
面向?qū)ο蟮娜筇卣?繼承,封裝,多態(tài)

繼承:
繼承:子類擁有父類的所有屬性,和方法。
繼承的好處:抽取出了重復(fù)的代碼,減少代碼冗余
繼承的缺點(diǎn):耦合性太強(qiáng)
繼承的使用注意
(1)OC中不允許子類和父類擁有相同名稱的成員變量名;
(2)OC中的子類可以擁有和父類相同名稱的方法,在子類調(diào)用時(shí),優(yōu)先去自己的內(nèi)部尋找,如果沒(méi)有則一層一層的往上找;
在子類中重寫(xiě)父類的方法,會(huì)覆蓋父類的方法。
super關(guān)鍵字:
super關(guān)鍵字,在子類中重寫(xiě)方法時(shí),可以讓調(diào)用者跳過(guò)這一層而調(diào)用父類中的方法。
使用場(chǎng)景:子類在重寫(xiě)父類方法時(shí),想要保留父類的一些行為。

封裝:
概念:封裝也稱為信息隱藏,是指利用抽象數(shù)據(jù)類型將數(shù)據(jù)和基于數(shù)據(jù)的操作封 裝在一起,使其構(gòu)成一個(gè)不可分割的獨(dú)立實(shí)體,數(shù)據(jù)被保護(hù)在抽象數(shù)據(jù)類型的內(nèi) 部,盡可能地隱藏內(nèi)部的細(xì)節(jié),只
保留一些對(duì)外接口使之與外部發(fā)生聯(lián)系。系統(tǒng) 的其他部分只有通過(guò)包裹在數(shù)據(jù)外面的被授權(quán)的操作來(lái)與這個(gè)抽象數(shù)據(jù)類型交流 與交互。也就是說(shuō),用戶無(wú)需知道對(duì)象內(nèi)部方法的實(shí)現(xiàn)細(xì)節(jié),但可以根據(jù)對(duì)象提 供的外部接口(對(duì)象名和參數(shù))訪問(wèn)該對(duì)象。
好處:(1)實(shí)現(xiàn)了專業(yè)的分工。將能實(shí)現(xiàn)某一特定功能的代碼封裝成一個(gè)獨(dú)立的實(shí) 體后,各程序員可以在需要的時(shí)候調(diào)用,從而實(shí)現(xiàn)了專業(yè)的分工。(2)隱藏信 息,實(shí)現(xiàn)細(xì)節(jié)。通過(guò)控制訪問(wèn)權(quán)限可以將可以將不想讓客戶端程序員看到的信息 隱藏起來(lái),如某客戶的銀行的密碼需要保密,只能對(duì)該客戶開(kāi)發(fā)權(quán)限。

多態(tài):
沒(méi)有繼承,就沒(méi)有多態(tài)
不同類的對(duì)象能夠定義相同名稱的方法
當(dāng)父類對(duì)象的指針或引用指向子類對(duì)象時(shí),會(huì)進(jìn)行動(dòng)態(tài)監(jiān)測(cè),調(diào)用真實(shí)的方法
C++只有虛函數(shù)才能實(shí)現(xiàn)多態(tài),OC中所有方法都可以
理解:子類以父類的身份出現(xiàn),但做事情時(shí)還是以自己的方法實(shí)現(xiàn)。子類以父類 的身份出現(xiàn)需要向上轉(zhuǎn)型(upcast),其中向上轉(zhuǎn)型是由JVM自動(dòng)實(shí)現(xiàn)的, 是安全 的,但向下轉(zhuǎn)型(downcast)是不安全的,需要強(qiáng)制轉(zhuǎn)換。子類以父類的身份出現(xiàn) 時(shí)自己特有的屬性和方法將不能使用。

而OC是典型的面向?qū)ο蟮恼Z(yǔ)言
OC也是一門(mén)動(dòng)態(tài)語(yǔ)言,那么他的動(dòng)態(tài)性是如何體現(xiàn)的呢?
先了解一下什么是動(dòng)態(tài)語(yǔ)言
** 動(dòng)態(tài)語(yǔ)言,是指程序在運(yùn)行時(shí)可以改變其結(jié)構(gòu):新的函數(shù)可以被引進(jìn),已有的函數(shù)可以被刪除等在結(jié)構(gòu)上的變化**
比如眾所周知的ECMAScript(****JavaScript****)便是一個(gè)動(dòng)態(tài)語(yǔ)言。除此之外如Ruby、Python等也都屬于動(dòng)態(tài)語(yǔ)言,而C、C++等語(yǔ)言則不屬于動(dòng)態(tài)語(yǔ)言。
OC的動(dòng)態(tài)特性表現(xiàn)為了三個(gè)方面:動(dòng)態(tài)類型、動(dòng)態(tài)綁定、動(dòng)態(tài)加載。之所以叫做動(dòng)態(tài),是因?yàn)楸仨毜竭\(yùn)行時(shí)(run time)才會(huì)做一些事情。


動(dòng)態(tài)類型:程序直到執(zhí)行時(shí)才能確定所屬的類。動(dòng)態(tài)類型,說(shuō)簡(jiǎn)單點(diǎn)就是id類型
id數(shù)據(jù)類型
id 通用的對(duì)象類型,可以存儲(chǔ)任意類型的對(duì)象,id后面沒(méi)有*號(hào),它本身就是個(gè)指針
類似于void * ,但只可以指向?qū)ο箢愋?br> 動(dòng)態(tài)綁定:程序直到執(zhí)行時(shí)才能確定實(shí)際要調(diào)用的方法。
動(dòng)態(tài)綁定所做的,即是在實(shí)例所屬類確定后,將某些屬性和相應(yīng)的方法綁定到實(shí)例上。
Class類:表示一個(gè)類名,class被創(chuàng)建后,我們可以把class來(lái)當(dāng)成對(duì)象的類。
Class cla1 = [類名 class]
Class cla2 = [對(duì)象 class]
Class cla3 = NSClassFromString(@"類名");
SEL 類成員方法的指針
可以理解 @selector()就是取類方法的編號(hào),他的行為基本可以等同C語(yǔ)言的中函數(shù)指針,只不過(guò)C語(yǔ)言中,可以把函數(shù)名直接賦給一個(gè)函數(shù)指針,而Object-C的類不能直接應(yīng)用函數(shù)指針,這樣只能做一個(gè)@selector語(yǔ)法來(lái)取.
它的結(jié)果是一個(gè)SEL類型。這個(gè)類型本質(zhì)是類方法的編號(hào)(函數(shù)地址)
1>類里面的方法都是被轉(zhuǎn)換成SEL變量進(jìn)行存儲(chǔ)的。
2>放類聲明一個(gè)對(duì)象,對(duì)象調(diào)用方法的時(shí)候,系統(tǒng)會(huì)被這個(gè)方法轉(zhuǎn)換成SEL,然后拿這個(gè)SEL到類方法中去匹配。
3>我們可以自己手動(dòng)把方法轉(zhuǎn)換成SEL,然后用這個(gè)SEL去查找方法(performSelector)。
-isMemberOfClass:
判斷是否是這個(gè)類的實(shí)例
-isKindOfClass:
判斷是否是這個(gè)類或者這個(gè)類的子類的實(shí)例
-respondsToSelector:
判讀實(shí)例是否有這樣方法
+instancesRespondToSelector:
判斷類是否有這個(gè)方法。此方法是類方法。
動(dòng)態(tài)加載
根據(jù)需求加載所需要的資源,這點(diǎn)很容易理解,對(duì)于iOS開(kāi)發(fā)來(lái)說(shuō),基本就是根據(jù)不同的機(jī)型做適配。最經(jīng)典的例子就是在Retina設(shè)備上加載@2x 的圖片,而在老一些的普通屏設(shè)備上加載原圖。隨著Retina iPad的推出,和之后可能的Retina Mac的出現(xiàn),這個(gè)特性相信會(huì)被越來(lái)越多地使用。

如果這篇文章對(duì)您有些許幫助 請(qǐng)給我點(diǎn)個(gè)心哦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,032評(píng)論 0 9
  • 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的...
    西木閱讀 30,872評(píng)論 33 466
  • OC基礎(chǔ)總結(jié) 重新回過(guò)頭看這些基礎(chǔ)知識(shí),對(duì)許多知識(shí)點(diǎn)都有新的認(rèn)識(shí),擁有堅(jiān)實(shí)的基礎(chǔ)才能更快的成長(zhǎng)。 #improt ...
    xx_cc閱讀 6,236評(píng)論 10 56
  • 我們常常會(huì)聽(tīng)說(shuō) Objective-C 是一門(mén)動(dòng)態(tài)語(yǔ)言,那么這個(gè)「動(dòng)態(tài)」表現(xiàn)在哪呢?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,319評(píng)論 0 7
  • 2017-12-18 11:19 吳桂儀是江西贛江一個(gè)新心媽媽,她把和兒子珈由的故事一個(gè)個(gè)鮮活的記錄了下來(lái)。 我...
    李靜媛嘛嘛閱讀 177評(píng)論 0 0

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