你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> 基礎向:漫談 OC 中的面向對象編程思想(一)

基礎向:漫談 OC 中的面向對象編程思想(一)

編輯:IOS開發基礎

1.jpg

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花式玩法章節會對這裡做出補充, 這裡只是先給出些基本概念.


  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved