02 - Object-C 面向對象

##1. 面向對象基本術語編程

  • 面向對象 Object Oriented,簡稱OO
  • 面向對象編程 Object Oriented Programming,簡稱OOP

##2. 類和對象函數

2.一、類的聲明

  • 類名\屬性的命名規則:有意義、駝峯標識、首字母大寫(類)\小寫(屬性)
  • 關鍵字:@interface@end
  • 代碼編寫
@interface Car : NSObject{
    @public
    int wheels; // 屬性: 多少個輪子
    int speed; // 屬性: 時速
}
- (void)run;// 方法,跑
@end

1.成員變量 - @interface的大括號{}中聲明的變量:wheels、speed - @interface的大括號和函數的大括號是不同的 - 默認會初始化爲0設計

2.@public @public可讓Car對象的wheels和speed屬性被外界訪問指針

3.NSObject 加上:NSObject的目的是讓Car類具有建立對象的能力code

###2.二、類的實現對象

  • 關鍵字:@implementation@end
// 類的實現
@implementation Car
- (void) run
{
    NSLog(@"%i個輪子,%i時速的車子跑起來了", wheels, speed);
}
@end
  • 沒有@interface,只有@implementation,也是能成功定義一個類的
@implementation Car : NSObject
{
    @public
    int wheels; // 多少個輪子
    int speed; // 時速
}
- (void) run
{
    NSLog(@"%i個輪子,%i時速的車子跑起來了", wheels, speed);
}
@end
  • @implementation中不能聲明和@interface同樣的成員變量

###2.三、建立對象繼承

Car *c = [Car new]; // [Car new]每次都會建立出新的對象,而且返回對象的地址,那麼就應該用一個指針變量保存對象的地址!
c->wheels = 3;// 賦值屬性
c->speed = 300;
[c run];// 調用方法

###2.四、常見錯誤內存

  • 只有類的聲明,沒有類的實現
  • 漏了@end
  • @interface@implementation嵌套
  • 兩個類的聲明嵌套
  • 成員變量沒有寫在括號裏面
  • 方法的聲明寫在了大括號裏面

###2.五、語法細節get

  • 成員變量不能在{}中進行初始化、不能被直接拿出去訪問
  • 方法不能當作函數同樣調用
  • 成員變量\方法不能用static等關鍵字修飾,別跟C語言混在一塊兒(暫時忽略)
  • 類的實現可用寫在main函數的後面,主要在聲明後面就好了

###2.六、面向對象封裝的好處編譯器

  • 更加接近人類的思考方式
  • 只須要關注對象,不須要關注步驟

###2.七、OC方法和函數的區別

  • OC方法只能聲明在@interface@end之間,只能實如今@implementation@end之間。也就是說OC方法不能獨立於類存在
  • C函數不屬於類,跟類沒有聯繫,C函數只歸定義函數的文件全部
  • C函數不能訪問OC對象的成員
  • 低級錯誤:方法有聲明,可是實現的時候寫成了函數

###2.八、OC的方法注意

  • 方法只有聲明,沒有實現(經典錯誤)
  • 方法沒有聲明,只有實現(編譯器警告,可是能調用,OC的弱語法)
  • 編譯的時候:訪問沒有的成員變量直接報錯,訪問沒有的方法,只是警告

##3. 方法 ###3.一、不帶參數的方法

  • 設計一個返回PI的方法
// 方法聲明
- (double)pi;
// 方法實現
- (double)pi
{
    return 3.14;
}

定義方法

  • 調用方法

調用方法

###3.二、帶一個參數的方法

  • 設計一個計算平方的方法
// 方法聲明
- (double)square:(double)number;
// 方法實現
- (double)square:(double)number
{
    return number * number;
}

  • 方法調用

###3.三、帶多個參數的方法

  • 設計一個計算和的方法
// 方法聲明
- (double)sumOfNum1:(double)num1 andNum2:(double)num2;
// 方法實現
- (double)sumOfNum1:(double)num1 andNum2:(double)num2
{
    return num1 + num2;
}

  • 調用方法

###3.四、方法名注意

  • 冒號也是方法名的一部分
  • 同一個類中不容許兩個對象方法同名

##4. 匿名對象

  • 屬性訪問
[Car  new]->speed = 200;
  • 方法調用
[[Car  new]  run];

##5. set方法和get方法 ###5.一、set方法和get方法的使用場合 @public的成員能夠被隨意賦值,應該使用set方法和get方法來管理成員的訪問(相似機場的安檢、水龍頭過濾,過濾掉不合理的東西),好比殭屍的生命值不能爲負數

###5.二、set方法

  1. 做用:用來設置成員變量,能夠在方法裏面過濾掉一些不合理的值
  2. 命名規範: 方法都是以set開頭,並且後面跟上成員變量名,成員變量名的首字母必須大寫形參名稱不要跟成員變量同名

###5.三、get方法

  1. 做用:返回對象內部的成員變量
  2. 命名規範:get方法的名稱通常就跟成員變量同名

###5.四、成員變量的命名規範

  • 成員變量都如下劃線 _ 開頭
  • 能夠跟get方法的名稱區分開
  • 能夠跟其餘局部變量區分開,一看到下劃線開頭的變量,確定是成員變量

###5.五、代碼示例

#import <Foundation/Foundation.h>
// 聲明
@interface Car : NSObject
{
    int _wheels; // 輪子個數
}
/*set方法*/
- (void) setWheels:(int)wheels;
/*get方法*/
- (int) wheels;
@end

@implementation Car
// set方法的實現
- (void) setWheels:(int)wheels
{
    // 對外面傳進來的輪子數進行過濾
    if (wheels<=0)
    {
        wheels = 1;
    }
    
    _wheels = wheels;
}

// get方法的實現
- (int) wheels
{
    return _wheels;
}
@end

###5.六、封裝的好處

  • 過濾不合理的值
  • 屏蔽內部的賦值過程
  • 讓外界沒必要關注內部的細節

##6. 類方法 ###6.一、基本概念

直接能夠用類名來執行的方法(類自己會在內存中佔據存儲空間,裏面有類\對象方法列表)

###6.2類方法和對象方法對比

  1. 對象方法
    • 以減號-開頭
    • 只能讓對象調用,沒有對象,這個方法根本不可能被執行
    • 對象方法能訪問實例變量(成員變量)
  2. 類方法
    • 以加號+開頭
    • 只能用類名調用,對象不能調用
    • 類方法中不能訪問實例變量(成員變量)
    • 使用場合:當不須要訪問成員變量的時候,儘可能用類方法
  3. 類方法和對象方法能夠同名

##7. self關鍵字 ###7.一、成員變量和局部變量同名

  • 當成員變量和局部變量同名時,採起就近原則,訪問的是局部變量
  • 用self訪問成員變量,區分同名的局部變量

###7.二、使用細節

  1. 出現的地方:全部的OC方法中(對象方法\類方法),不能出如今函數
  2. 做用 使用 "self->成員變量名" 訪問當前方法調用的成員變量 使用 "[self 方法名];" 來調用方法(對象方法\類方法)

###7.三、常見錯誤

  • 低級錯誤:用self去調用函數
  • 類方法中用self調用對象方法,對象方法中用self調用類方法
  • self死循環

##8. 對象與函數參數

  • 對象成員變量做爲函數參數
  • 指向對象的指針做爲函數參數
    • 修改指向指向對象的成員
    • 修改指針的指向

##9. 繼承 ###9.一、繼承的基本用法

  • 子類在父類的基礎上拓充屬性和方法
  • 子類方法和屬性的訪問過程:若是子類沒有,就去訪問父類的
  • 父類被繼承了仍是能照常使用的
  • 父類的靜態方法
  • 畫繼承結構圖,從子類抽取到父類
  • NSObject的引出:所有OC類的最終父類,包含了一些經常使用方法,好比+new

###9.二、繼承的專業術語

  • 父類\超類 superclass
  • 子類 subclass\subclasses

###9.三、繼承的細節

  • 單繼承
  • 子類和父類不能有相同的成員變量
  • 方法的重寫

###9.四、super關鍵字

  • 分別調用父類的對象方法和類方法

###9.五、繼承的好處

  • 不改變原來模型的基礎上,拓充方法
  • 創建了類與類之間的聯繫
  • 抽取了公共代碼
  • 壞處:耦合性強

###9.六、繼承的使用場合

  • 它的全部屬性都是你想要的,通常就繼承
  • 它的部分屬性是你想要的,能夠抽取出另外一個父類

##10. 多態 ###10.一、多態的基本概念

  • 某一類事物的多種形態
  • OC對象具備多態性

###10.二、多態的體現

Person *p = [Student new];
p->age = 100;
[p walk];
  • 子類對象賦值給父類指針
  • 父類指針訪問對應的屬性和方法

###10.三、多態的好處

  • 用父類接收參數,節省代碼

###10.四、多態的侷限性

  • 不能訪問子類的屬性(能夠考慮強制轉換)

###10.五、多態的細節

  • 動態綁定:在運行時根據對象的類型肯定動態調用的方法
相關文章
相關標籤/搜索