天天看點

017-封裝-OC筆記

1.【了解】異常處理

2.【掌握】類方法

3.【掌握】nsstring類

4.【掌握】匿名對象

5.【掌握】封裝執行個體變量

6.【掌握】對象之間的關系

什麼是異常?

代碼完全符合文法規範,可以編譯、連結、執行,但是在程式運作的時候,當程式處于某種特定情況下的時候,程式運作就會出錯,像這樣的情況就叫做程式發生了異常。一旦發生異常,程式會立即奔潰。為了避免程式在發生異常的時候奔潰,oc提供了@try @catch異常處理。

異常處理文法:

@try {

    //可能發生異常的代碼

}

@catch (nsexception *指針名) {

    //發生異常後執行的代碼

@finally {

    //無論有沒有發生異常,都會執行的代碼

執行步驟:

第一種情況:先執行@try中的代碼,如果這裡面的代碼發生了異常,系統就會把異常資訊存儲到@catch中的指針變量,然後執行@catch中的代碼。@catch中的代碼執行完畢後,還會執行@finally中的代碼(@finally是可選的)。

第二種情況:先執行@try中的代碼,如果@try中的代碼不發生異常,@catch中的代碼不會執行。但還是會執行@finally中的代碼(@finally是可選的)。是以,@catch中的代碼隻有在@try中的代碼發生異常的時候才會執行。

注意:

1.@try-@catch隻能處理oc中的異常(跟類和對象有關的)。

2.寫代碼過程中盡力使用if來判斷,避免異常。

3.@finally不是必須寫的語句,可以沒有@finally。

oc中的方法分為兩種,對象方法(執行個體方法)和類方法(靜态方法)。

對象方法:依賴于對象,對象方法必須建立對象,通過對象名來調用。

類方法:不依賴與對象,類方法不需要建立對象,通過類名來調用。

聲明文法:+ (傳回值類型)方法名;

//聲明類方法

@interface person : nsobject

+ (void)test;

@end

//實作類方法

@implementation person

+ (void)test{

    nslog(@"this is a class method!");

//主函數裡調用類方法

[person test];

1.對象方法和類方法的方法名可以同名,兩個方法互不影響。

2.類方法調用不需要建立對象,從效率上而言會更快一些。

3.對象方法隻能通過對象名來調用,類方法隻能通過類名來調用。

4.對象方法中可以直接通路執行個體變量和類方法,類方法中不能直接通路執行個體變量和對象方法。

5.如果方法不需要通路對象的執行個體變量的時候,我們可以将其定義為類方法,提高效率。

類方法的規範

提供一個和類同名的類方法來建立一個對象。比如:

+ (person *)person;//聲明類方法

+ (person *)person{

    person *person = [person new];//建立對象person

    return person;//傳回對象person

提供一個類方法建立對象,并讓調用者可以初始化新建立對象的執行個體變量的值。比如:

+ (person *)personwithname:(nsstring *)name;//聲明類方法

+ (person *)personwithname:(nsstring *)name{

    person -> _name = name;//将調用者傳遞進來的參數指派給person對象的執行個體變量

oc中提供了一個字元串類nsstring,以對象的形式存儲字元串。

nsstring類的常用方法

//stringwithcstring:将c語言字元串轉化為oc字元串。

nsstring *str = [nsstring stringwithcstring:"c字元串"];

//stringwithformat:格式化字元串,也可以做多個變量、字元串的拼接。

for(int i = 1;i <= 1000;i++){

    nsstring *str = [nsstring stringwithformat:@"d",i];

    nslog(@"%@",str);

//length計算字元串長度,是計算字元個數,一個中文字也是1個長度。

nsstring *str = @"字元串abcd";

nsuinteger length = [str length];//這裡是長度為7

//characteratindex:擷取指定位置的字元,位置從0開始遞增。

unichar ch = [str characteratindex:3];//從0開始計算

nslog(@"ch = %c",ch); //%c oc裡新增的格式控符,可以輸出單個中文

//isequaltostring:比較兩個字元串是否相同。

nsstring *str1 = @"字元串abcd";

bool res = [str isequaltostring:str1];

//compare:比較兩個字元串的大小(ascii)

nsstring *s1 = @"china";

nsstring *s2 = @"japan";

int res = [s1 compare:s2];

nslog(@"res = %i",res);//s1 < s2則傳回1  s1 > s2 傳回-1 相等傳回0

執行個體化一個對象的時候,沒有用任何指針指向這個對象,這個對象就是匿名對象。并且匿名對象隻能調用一次,是以如果你隻是為了調用某一個對象的對象方法,就可以使用匿名對象。比如:

//person.h檔案

#import

{

    nsstring *_name;

- (void)sayhi;

//person.m檔案

#import "person.h"

- (void)sayhi{

    nslog(@"這是對象方法");

//main.m檔案

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        //給匿名對象的執行個體變量指派,不過匿名對象隻能通路一次,指派後就不能再使用了

        [person new] -> name = @"jack";

        //調用匿名對象的對象方法,調用完了就不再用這個對象了

        [[person new] sayhi];

    }

    return 0;

一個類之中有多個屬性、方法,把這些成員封裝在一個類中,把這個類當做一個整體來使用。

封裝的好處:便于管理代碼的維護,以類為機關來管理他們。屏蔽内部的實作,對于外部而言隻是一個對象。

為對象的屬性指派的時候,隻要指派的資料的類型和屬性的類型一緻就可以了。但是,這樣的指派往往都不能随意指派。比如人的年齡為int類型,我們指派-10文法也不會報錯。但這種指派不符合實際情況,是以我們要為屬性指派範圍加以限定。

首先,執行個體變量一定不能被@public修飾,因為一旦被@public修飾,就能在外界通過對象名來通路這個執行個體變量,随意修改執行個體變量的值。然後給執行個體變量提供兩種方法來供外界為執行個體變量指派和通路,也就是setter和getter方法。隻有getter方法沒有setter方法叫隻讀封裝,隻有setter方法沒有getter方法叫隻寫封裝。

為類提供一種專門為執行個體變量指派的方法 setter

1.這個方法一定是一個對象方法,因為隻有對象方法才能直接通路執行個體變量。

2.這個方法一定沒有傳回值,為執行個體變量指派不需要傳回值。

3.這個方法一定是有參數的,為執行個體變量指派一定需要傳入一個和執行個體變量類型相同的參數。

4.這個方法的方法名以set開頭,後面跟執行個體變量名去掉下劃線,并首字母大寫。

為類提供一種專門通路執行個體變量的值的方法 getter

2.這個方法一定有傳回值,供外界通路執行個體變量,必須要傳回給調用者執行個體變量的值。

3.這個方法一定沒有參數,通路執行個體變量的值不需要傳入任何參數。

4.這個方法的方法名就是去掉下劃線的執行個體變量的名字。

    //不要給執行個體變量@public修飾

    int _age;

//setter聲明

- (void)setage:(int)age;

//getter聲明

- (int)age;

//setter實作

- (void)setage:(int)age{

    //傳入的年齡在 0 - 120之間才能指派,否則輸出提示

    if(age > 0 && age < 120){

        _age = age;

    }else{

        nslog(@"年齡不符合");

//getter實作

- (int)age{

    return _age;

        //執行個體化一個對象p

        person *p = [person new];

        //調用p對象setage方法為對象的執行個體變量指派

        [p setage:200];//因為不符合規範,會列印出 年齡不符合

        //輸出p對象的執行個體變量age的值

        nslog(@"age = %i",[p age]);//輸出 age = 0

1.setter和getter方法的命名必須符合規範。

2.執行個體變量無論如何都不能用@public修飾,不然就不符合封裝的理念。

3.隻要執行個體變量要被外界通路,都應該為他封裝一個setter和getter方法。

組合關系

一個類是由多個對象組合而成的(多個對象都是同一個類的執行個體變量),那麼他們之間的關系就叫組合關系。

依賴關系

一個方法的參數是另一個對象(依賴參數那個對象,沒有了參數就無法整了),那麼他們之間的關系就是依賴關系。

關聯關系

當一個對象擁有另外一個對象的時候(一個對象是另一個對象的執行個體變量,但是他們并不是組合關系),那麼他們之間的關系就是關聯關系。

面向對象設計中:

耦合度  當修改一個對象的時候,對另外一個對象的影響程度

低耦合  當修改一個對象的對其他對象影響比較小

高内聚  一個對象僅僅做自己相關的事情

面向對象設計原則是高内聚、低耦合,單一職責原則。

(整理于網上)

轉自:http://blog.csdn.net/qq_31810357

繼續閱讀