類別(Category)與擴展(Extensions)

一.類別(Category)框架

         類別(Category)是一種能夠爲現有的類(包括類簇:NSString...,甚至源碼沒法得到的類)添加新方法的方式無需從現有的類繼承子類。類別添加的新方法能夠被子類繼承。編碼

         注:繼承(inheritance)沒法爲一個類簇建立子類。類別不能添加實例變量。orm

1. 建立類別對象

1.1 聲明類別繼承

       類別的聲明和類的聲明格式類似:源碼

       @interface ClassName(CategoryName)it

            //method declarationsio

       @end//CategoryName編譯

 

 

       頭文件"NSString+Tools.h":form

  #import <Cocoa/Cocoa.h>

  @interface NSString (Tools)

  - (NSNumber *) lengthAsNumber;

  @end//Tools

1.2 實現類別

 

        實現文件"NSString+Tools.m":

  #import "NSString+Tools.h"

  @implementation NSString(Tools)

  - (NSNumber *) lengthAsNumber

  {

   unsigned int length = [self length];

            return [NSNumber numberWithUnsignedInt: length];

  }

  @end//Tools

 

2. 類別的做用

      類別有如下5個主要做用:

      ①爲現有的類添加新方法;

 

      ②將類的實現分散到多個不一樣文件或多個不一樣框架中(把一個大的類按功能劃分紅幾塊,便於維護);

      ③建立對私有方法的前嚮應用;

      ④使用category的非正式協議(informal protocol)來實現委託(delegation);

      ⑤經過替換現有類中的方法,修正現有類(沒有源碼文件的狀況下)的功能或錯誤。

        2.1 把類按功能劃分紅幾塊

 

                UIKIT_CLASS_AVAILABLE(2_0) @interface UIView : UIResponder<NSCoding, UIAppearance, UIAppearanceContainer> {

                 ................................

                 }

 

                 .................................

                @end//UIView                   

 

                @interface UIView(UIViewGeometry)

                   .................  

                @end//UIViewGeometry

 

 

                @interface UIView(UIViewHierarchy)

                   .................

                @end//UIViewHierarchy

 

       

                @interface UIView(UIViewRendering)

                    ................

                @end//UIViewRendering

 

 

                @interface UIView(UIViewAnimation)

                    ...............

                @end//UIViewAnimation

 

 

 

                @interface UIView(UIViewAnimationWithBlocks)

                     ........................

                @end//UIViewAnimationWithBlocks

 

 

 

        2.2 委託和類別

             委託是類別的一種應用:被髮送給委託對象的方法能夠聲明爲一個NSObject的類別。建立NSObject的類別稱爲「建立一個非正式協議」。非正式協議只是一種表達方式,它表示「這裏有一些你可能但願實現的方法,固然你也能夠不實現這些方法」。示例NSNetService委託方法的部分聲明以下:

       @interface NSObject(NSNetServiceBrowserDelegateMethods)

       - (void)netServiceBrowserWillSearch: (NSNetServiceBrowser*) browser;

       - (void)netServiceBrowser: (NSNetServiceBrowser*) aNetServiceBrowser

                         didFindService: (NSNetService *) service

                            moreComing: (BOOL) moreComing;

       - (void)netServiceBrowserDidStopSearch: (NSNetServiceBrowser*) browser;       

 

       - (void)netServiceBrowser: (NSNetServiceBrowser*) aNetServiceBrowser

                         didRemoveService: (NSNetService *) service

                            moreComing: (BOOL) moreComing;

       @end//NSNetServiceBrowserDelegateMethods

       2.2.1 如何知道委託對象可否處理髮送給它的消息(響應選擇器)

             NSNetServiceBrowser首先檢查委託對象,經過NSObject類的respondsToSelector:的方法詢問其可否響應該選擇器。若是委託對象能響應,則NSNetServiceBrowser給委託對象發送消息,反正則不發。

             選擇器只是一個方法的名稱,它以Object-C運行時使用的特殊方式編碼,以快速執行查詢。使用@selector(方法名稱)預編譯指令指定選擇器。示例:Car類的setEngine:方法的選擇器是 @selector(setEngine:)

             Car類的setTire: atIndex:方法的選擇器是  @selector(setTire: atIndex:)

             Car *car = [[Car alloc] init];

             if ([car respondsToSelector: @selector(setEngine:)])

             {

                     return YES;

             }

 

3. 類別的侷限性

      ①沒法向現有的類中添加新的實例變量(類別沒有位置容納實例變量);    

      ②方法名稱衝突,即類別中的新方法的名稱與現有類中方法名稱重名,類別具備更高的優先級,類別中的方法將徹底取代現有類中的方法(再也沒法訪問現有類中的同名方法)。

 

二.類擴展Class extensions

     類擴展聲明格式@interface MyClass(), 能夠在類擴展中聲明屬性和實例變量。

@interface MyClass : NSObject

    ...................

@end

 

@interface MyClass()//類擴展

{

     float _value;

}

    @property(assign,readonly) value;

@end

相關文章
相關標籤/搜索