Objective-C 常寫作Objc或者OC. 它的流行歸功於iPhone的成功。編寫iPhone應用程序主要編程語言就是Objective—C(2014年6月的時候,apple為了新商業戰略,吸引更多的開發者入門,推出了Swift。)
Objective-C語言是一種簡單的基於當下先進的面向對象的一種計算機語言。它作為標准的ANSI C語言的擴展,輕量但很強大。相對C, Objective-C新加入的一些內容更多是基於Smalltalk語言,Smalltalk是面向對象編程語言的創始者之一。Obejctive-C被設計賦予C語言完整的面向對象編程的能力,並以一種簡單和直接的方式來實現。
相信各位讀者最早接觸OC的時候就看過以上摘自百度和官方文檔的介紹, 之所以在本文裡再次提出來, 是為了告訴大伙OC是在C的基礎上, 賦予了面向對象的能力. 我們當初在看到這段話的時候可曾思考過什麼是面向對象, OC的這種能力具體是如何實現的, 能帶來哪些不一樣的特性呢?
我們雖然用的是面向對象的語言, 可是很多同學碼出來的代碼還是大段的面向過程的思想. 我們只是把面向對象的特性當作OC語言本身的一種語法, 然後為了方便, 快速實現需求, 就這麼用罷了. 或者干脆就不用.
設想一種場景, 下班回家, 用面向過程的寫法是:
工作結束, 下班啦 { [小張 下班啦:晚上8點]; [小王 下班啦:晚上8點]; } 小張下班的時候: [小張自己 吃飯]; 如果時間是6點到9點之間: [小張自己 坐車]; [小張自己 塞車]; 否則的話, 如果是9點以後: [小張自己 打車]; 小王下班的時候: [小王自己 吃飯]; [小王自己 打車];
面向的對象的寫法則是另外一種風格:
工作結束, 下班啦 { [小張 下班啦:晚上8點]; [小王 下班啦:晚上8點]; } 小張下班的時候: [小張 吃飯]; 如果時間是6點到9點之間: [小張 坐車]; [小張 塞車]; 否則的話, 如果是9點以後: [小張 打車]; 小王下班的時候: [小王 吃飯]; [小王 打車];
面向過程是一種以過程為中心的編程思想, 可以清晰的知道下班的步驟是吃飯, 做公交, 小王還塞了車; 面向對象則以對象為主體, 強調了人下班了, 人在下班後人吃飯, 人坐車. 面向對象的語法顯然更加符合人類的習慣一些.
大伙的日常開發中, 哪種寫法比較多呢?
面向對象的基本概念
我們先來解決第一個問題, 什麼是面向對象編程, 他和普通的編程有什麼區別.
面向對象編程(Object Oriented Programming,OOP,面向對象程序設計)是一種計算是一種計算機編程范式, 它將對象作為問題空間的基本元素, 利用對象和對象之間的相互作用來設計程序.
對象的概念
面向對象思想把整個世界看成由各種對象來組成的. 這些對象具有屬性和行為, OC中稱之為屬性和方法. 從最簡單的整數到復雜的飛機等均可看作對象, 它不僅能表示具體的事物, 還能表示抽象的規則, 計劃或事件.
比如, 我身上的手機是一個對象. 它有自己有名字, 屏幕尺寸, 重量大小等屬性。它的名字是: “Heaven’s ip6”, 這個就是這個屬性的值。這台手機還可以打電話發短信,這些就是它的方法。
// 初始化一個手機 IPhone6 *ip = [[IPhone6 alloc] init]; // 我的手機的名字叫 Heaven's ip6 ip.name = @"Heaven's ip6"; // 它撥打電話, 給電信打個電話玩玩 [ip call:@"10000"];
類的概念
面向對象思想的中, 具體的事物是對象, 具有相同或相似性質的對象的抽象或者說描述就是類. 因此, 對象的抽象是類, 類的具體化就是對象, 也可以說類的實例是對象.
比如我身上的土豪金是一個對象, 你身上東北銀是一個對象, iPhone6是一個類. 我們可以這樣描述這台手機:
@interface IPhone6 : NSObject // 智能手機有名字 @property (nonatomic, copy) NSString *nickname; // iPhone有顏色 @property (nonatomic, copy) NSString *color; // 手機可以打電話 - (void)call:(NSString *)phoneNum; @end
元類的概念
對象的抽象是類, 類的抽象又是什麼呢?
前文提到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的, 我們可以修改這個對象的屬性的值, 從而實現一些特殊的用途.
我們可以動態的添加一個方法.
class_addMethod(Class cls, SEL name, IMP imp, const char *types)
比如最早用功能機的時候是不可以安裝app的, 我用的iPhone6是智能手機, 可以給他安裝一個APP, 這樣就可以干一些原本不能干的時期.
還可以通過swizzle技術交換2個方法的實現. 從而做出AOP編程.
後面的runtime花式玩法章節會對這裡做出補充, 這裡只是先給出些基本概念.