ios category類別的使用

來源:互聯網
上載者:User

ios category類別的使用

Objective-C提供了一個非常靈活的類(Class)擴充機制-類別(Category)。類別用於對一個已經存在的類添加方法(Methods)。你只需要知道這個類的公開介面,不需要知道類的原始碼。需要注意的是,類別不能為已存在的類添加執行個體變數(Instance
Variables)。

 類別的基本文法如下:
@interface ClassName(CategoryName)
//method declarations
@end
@interface 類名(類別名)
類別方法申明
@end

注意幾點:

1.現有類的類名位於 @interface之後

2.括弧中是類別的名稱(只要名稱唯一,可以添加任意多的類別)

3.類別沒有執行個體變數部分

類別的文法與類的文法非常相似。類別的方法就是類的方法。類別的定義可以放在一個單獨的檔案中("類別名.h"), 也可以放在一個已存在的類的定義檔案中(.h檔案)。類別的實現則可放在一個單獨的“類別名.m”檔案中,或另一個類的實現檔案中。這點也與類的定義相似。因為類別的方法就是類的方法,所以類別的方法可以自由引用類的執行個體變數(無論公有或私人)。

 子類(subclassing)是進行類擴充的另一種常用方法。與子類相比,類別最主要的優點是:系統中已經存在的類可以不需修改就可使用類別的擴充功能。例如,假設系統中存在一個類A;另外一個類B中定義了一個類A類型的執行個體變數,並包含了類A的標頭檔“#import <A.h>"。假設一段時間後,需要對類A擴充幾個新的方法。如果用子類,就需要建立一個子類A-1。如果類B想要使用類A的新方法,就要進行如下修改:1) 將包含的標頭檔改為"#import<A-1.h>";
2)將所有用到的類A對象改為類A-1的對象。可以想象,如何有很多類需要用到類A的新功能(比如類A是iOS中的類UIViewController),隨著系統的升級(iOS從1.0到5.0),你的程式需要不停地進行這種繁瑣地修改。如果使用類別,即使類A升級了,系統中其它的類可以不需任何修改,直接就可以調用類A的新方法。  類別的第二大優點是實現了功能的局部化封裝。類別定義可以放在一個已存在的類(類A)的定義檔案中(.h)。這意味著這個類別只有在類A被引用的前提下才會被外部看到。如果另一個類(類B)不需要用到類A的功能(沒有包含類A的.h檔案),也就不會看到依附類A存在的類別。iOS SDK中廣泛運用這種類別定義法來封裝功能。例如,在 UINavigationController.h中定義了專為UINavigationController擴充的UIViewController類別: @interface UIViewController (UINavigationControllerItem)
@property(nonatomic,readonly,retain) UINavigationItem *navigationItem; 
@property(nonatomic,readonly,retain) UINavigationController *navigationController; 
......
@end
如果一個類不引用UINavigationController.h,也就不會看到navigationItem和navigationController這兩個性質申明(declared
property)。 類別的另一個優點是輕巧(light-weight)。很多時候,對已存在的類所需的擴充僅僅是幾個新方法。這時,用類別避免了在系統中留下很多非常短小的“微”子類,使程式更加緊湊。 歸納:

1、實作類別別

同實作類別相似,實現方法即可

2、 類別的局限性

1.類別不能添加新的執行個體變數

2.命名衝突,如果類別中方法和類中已有方法同名,則類別具有更高優先順序

3 類別的作用

1.將類的實現分散到多個不同檔案或多個不同架構中

2.建立私人方法的前向引用

3.向對象添加非正式協議

4 利用類別分散實現

利用類別可以將類的方法分散到多個源檔案中

特別指出的是:類別可以訪問其繼承的類的執行個體變數

在使用一個方法時,對象的方法是在介面中聲明、父類中聲明、還是類別中聲明並不重要

類別不僅可以分散實現到不同源檔案,也可跨架構

5、 使用類別建立前向引用

雖然可以實現未聲明的方法,但是編譯器會提出警告

通過類別可以提供聲明,而且,聲明的方法不必要一定在類別的實現中實現,也可以在類的實現中實現

6、 非正式協議和委託類別

委託(delegage)是一種對象,另一個類的對象會要求委派物件執行它的某些操作

委派物件接受其它對象對它的特定方法的調用

其實就是委派物件必須實現別的對象調用的方法,與介面類似

7、 ITunesFinder項目

8 、委託和類別

委託和類別有什麼關係?委託強調類別的另一種應用:被發送給委派物件的方法可以聲明為一個NSObject的類別

建立一個NSObject的類別稱為“建立一個非正式協議”

9、 響應選取器

選取器只是一個方法名稱,可以使用@selector()先行編譯指令指定選取器,其中方法名位於圓括弧中,但它以OC運行時使用的特殊方式編碼,以快速執行查詢

NSObject提供了一個respondsToSelector的方法,詢問對象以確定其是否實現某個特定訊息

10、 選取器的其他應用

選取器可以被傳遞,可以作為方法參數,甚至可以作為執行個體變數儲存

轉帖:http://www.cnblogs.com/hopeanCom/archive/2012/11/16/2773110.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.