面向對象編程,即OOP,是一種編程範式,知足面向對象編程的語言,通常會提供類、 封裝、繼承等語法和概念來輔助咱們進行面向對象編程。程序員
面向對象是基於萬物皆對象這個哲學觀點. 所謂的面向對象就是將咱們的程序模塊化, 對象化,把具體事物的特性屬性和經過這些屬性來實現一些動做的具體方法放到一個類 裏面編程
面向對象的三大特徵 繼承,封裝,多態 安全
繼承模塊化
繼承:子類擁有父類的全部屬性,和方法。函數
繼承的好處:抽取出了重複的代碼,減小代碼冗餘spa
繼承的缺點:耦合性太強指針
繼承的使用注意orm
(1)OC中不容許子類和父類擁有相同名稱的成員變量名;htm
(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的出現,這個特性相信會被愈來愈多地使用。