面向對象編程,即OOP,是一種編程范式,滿足面向對象編程的語言,一般會提供類、 封裝、繼承等語法和概念來輔助我們進行面向對象編程。
面向對象是基於萬物皆對象這個哲學觀點. 所謂的面向對象就是將我們的程序模塊化, 對象化,把具體事物的特性屬性和通過這些屬性來實現一些動作的具體方法放到一個類 里面
面向對象的三大特征 繼承,封裝,多態
繼承
繼承:子類擁有父類的所有屬性,和方法。
繼承的好處:抽取出了重復的代碼,減少代碼冗余
繼承的缺點:耦合性太強
繼承的使用注意
(1)OC中不允許子類和父類擁有相同名稱的成員變量名;
(2)OC中的子類可以擁有和父類相同名稱的方法,在子類調用時,優先去自己的內部尋找,如果沒有則一層一層的往上找;
在子類中重寫父類的方法,會覆蓋父類的方法。
super關鍵字:
super關鍵字,在子類中重寫方法時,可以讓調用者跳過這一層而調用父類中的方法。
使用場景:子類在重寫父類方法時,想要保留父類的一些行為。
封裝
概念:封裝也稱為信息隱藏,是指利用抽象數據類型將數據和基於數據的操作封 裝在一起,使其構成一個不可分割的獨立實體,數據被保護在抽象數據類型的內 部,盡可能地隱藏內部的細節,只 保留一些對外接口使之與外部發生聯系。系統 的其他部分只有通過包裹在數據外面的被授權的操作來與這個抽象數據類型交流 與交互。也就是說,用戶無需知道對象內部方法的實現細節,但可以根據對象提 供的外部接口(對象名和參數)訪問該對象。
好處:(1)實現了專業的分工。將能實現某一特定功能的代碼封裝成一個獨立的實 體后,各程序員可以在需要的時候調用,從而實現了專業的分工。(2)隱藏信 息,實現細節。通過控制訪問權限可以將可以將不想讓客戶端程序員看到的信息 隱藏起來,如某客戶的銀行的密碼需要保密,只能對該客戶開發權限。
多態:
沒有繼承,就沒有多態
不同類的對象能夠定義相同名稱的方法
當父類對象的指針或引用指向子類對象時,會進行動態監測,調用真實的方法
C++只有虛函數才能實現多態,OC中所有方法都可以
理解:子類以父類的身份出現,但做事情時還是以自己的方法實現。子類以父類 的身份出現需要向上轉型(upcast),其中向上轉型是由JVM自動實現的, 是安全 的,但向下轉型(downcast)是不安全的,需要強制轉換。子類以父類的身份出現 時自己特有的屬性和方法將不能使用。
而OC是典型的面向對象的語言
OC也是一門動態語言,那么他的動態性是如何體現的呢?
先了解一下什么是動態語言
動態語言,是指程序在運行時可以改變其結構:新的函數可以被引進,已有的函數可以被刪除等在結構上的變化
比如眾所周知的ECMAScript(JavaScript)便是一個動態語言。除此之外如Ruby、Python等也都屬於動態語言,而C、C++等語言則不屬於動態語言。
OC的動態特性表現為了三個方面:動態類型、動態綁定、動態加載。之所以叫做動態,是因為必須到運行時(run time)才會做一些事情。
動態類型:程序直到執行時才能確定所屬的類。動態類型,說簡單點就是id類型
id數據類型
id 通用的對象類型,可以存儲任意類型的對象,id后面沒有*號,它本身就是個指針
類似於void * ,但只可以指向對象類型
動態綁定:程序直到執行時才能確定實際要調用的方法。
動態綁定所做的,即是在實例所屬類確定后,將某些屬性和相應的方法綁定到實例上。
Class類:表示一個類名,class被創建后,我們可以把class來當成對象的類。
Class cla1 = [類名 class]
Class cla2 = [對象 class]
Class cla3 = NSClassFromString(@"類名");
SEL 類成員方法的指針
可以理解 @selector()就是取類方法的編號,他的行為基本可以等同C語言的中函數指針,只不過C語言中,可以把函數名直接賦給一個函數指針,而Object-C的類不能直接應用函數指針,這樣只能做一個@selector語法來取.
它的結果是一個SEL類型。這個類型本質是類方法的編號(函數地址)
1>類里面的方法都是被轉換成SEL變量進行存儲的。
2>放類聲明一個對象,對象調用方法的時候,系統會被這個方法轉換成SEL,然后拿這個SEL到類方法中去匹配。
3>我們可以自己手動把方法轉換成SEL,然后用這個SEL去查找方法(performSelector)。
-isMemberOfClass:
判斷是否是這個類的實例
-isKindOfClass:
判斷是否是這個類或者這個類的子類的實例
-respondsToSelector:
判讀實例是否有這樣方法
+instancesRespondToSelector:
判斷類是否有這個方法。此方法是類方法。
動態加載
根據需求加載所需要的資源,這點很容易理解,對於iOS開發來說,基本就是根據不同的機型做適配。最經典的例子就是在Retina設備上加載@2x 的圖片,而在老一些的普通屏設備上加載原圖。隨着Retina iPad的推出,和之后可能的Retina Mac的出現,這個特性相信會被越來越多地使用。
