一.類別(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