面向對象概念
面向對象編程(Object Oriented Programming,OOP,面向對象程序設計)是一種計算是一種計算機編程范式, 它將對象作為問題空間的基本元素, 利用對象和對象之間的相互作用來設計程序.
對象的概念
面向對象思想把整個世界看成由各種對象來組成的. 這些對象具有屬性和行為, OC中稱之為屬性和方法. 從最簡單的整數到復雜的飛機等均可看作對象, 它不僅能表示具體的事物, 還能表示抽象的規則, 計劃或事件.
類的概念
面向對象思想的中, 具體的事物是對象, 具有相同或相似性質的對象的抽象或者說描述就是類. 因此, 對象的抽象是類, 類的具體化就是對象, 也可以說類的實例是對象.
元類的概念
對象的抽象是類, 類的抽象又是什么呢?
前文提到OC是在C的基礎上, 賦予了面向對象的能力. OC和其他的面向對象語言有一點區別, 它有元類的概念. OC中的’類’, 它的抽象叫做元類(meta class). 我們可以認為元類的具體化的對象就是類.
元類的結構定義如下:
struct objc_class {
Class isa;
Class super_class;
const char *name;
long version;
long info;
long instance_size;
struct objc_ivar_list *ivars;
struct objc_method_list **methodLists;
struct objc_cache *cache;
struct objc_protocol_list *protocols;
} OBJC2_UNAVAILABLE;
類也有自己的屬性: 比如, name是類的名字, 這里是IPhone6. 對象的屬性則是在ivars里, 這里姑且先讓我用屬性來稱呼. methodLists是類的方法列表, 就手機的類的來說, 他的methodLists里就有call這個方法.
類也是一個具體的對象, 正因為OC是這樣實現OOP的, 我們可以修改這個對象的屬性的值, 從而實現一些特殊的用途.
我們可以動態的添加一個方法.
比如最早用功能機的時候是不可以安裝app的, 我用的iPhone6是智能手機, 可以給他安裝一個APP, 這樣就可以干一些原本不能干的事情.
還可以通過swizzle技術交換2個方法的實現. 從而做出AOP編程.
類與對象的實質,參考文檔:
http://southpeak.github.io/2014/10/25/objective-c-runtime-1/
http://www.lxweimin.com/p/001b296688ec
https://juejin.im/entry/587d887f1b69e60058486a71