標籤:style blog http io ar color os 使用 sp
ios中的category與extension Objective-c中提供了可以讓我們擴充類定義的手段:類目,延展和協議。類目:為已知的類增加新的方法;延展:通知在本類的定義裡使用類目來聲明私人方法,和執行個體變數;協議:協議聲明了可以被任何類實現的方法。
注意:這些手段只能增加類的方法,並不能用於增加執行個體變數(延展除外),要增加類的執行個體變數,只能通過定義子類來間接實現。
1、類目
1)聲明類目
@interface NSString (NumberConvenience)
-(NSNumber *)lengthAsNumber;
@end
該聲明具有2個特點。首先,現有類位於@interface關鍵字之後,其後是位於圓括弧中的一個新名稱。該聲明表示,類別的名稱是NumberConvenience,而且該類別將向NSString類中添加方法。只要保證類別名稱的唯一性,你可以向一個類中添加任意多得類別。
其次,你可以指定希望向其添加類別的類以及類別的名稱,而且你還可以列出添加的方法,最後以@end結束。由於不能添加新執行個體變數,因此與類聲明不同的是,類別的聲明中沒有執行個體變數部分。
2)類目的局限性
第一,無法向類中添加新的執行個體變數。
第二,易名稱衝突,即類別中的方法與現有的方法重名。當發生名稱衝突時,類別具有更高的優先順序。你的類別方法將完全取代初始方法,從而無法再使用初始方法。有些編程人員在自己的類別方法中增加一個首碼,以確保不發生名稱衝突。
有一些技術可以克服類別無法增加新執行個體變數的局限。例如,可以使用全域字典儲存物件與你想要關聯的額外變數之間的映射。但此時你可能需要認真考慮一下,類別是否是完成當前任務的最佳選擇。
3)類目的作用
cocoa中得類別主要用於3個目的:第一,將類的實現分散到不同檔案或者不同架構中。第二,建立對私人方法的前向引用。(為現有類添加新方法)第三,向對象添加非正式協議。(用類別的非正式協議實現委託)(談一下委託(即代理),委託是類別的一種應用,被發送給委派物件的方法,可聲明為一個nsobject的類別,建立一個NSobject的類別成為建立一個“非正式式協議”,他表示“這裡有一些你希望實現的方法,當然可實現可不實現”).
2、延展
類的延展可以看作是一種匿名的類目,類有時需要一些只為自己所見,所用的私人方法這種私人方法可以通過延展的方式來聲明,延展中定義的方法在類本身的@implementation代碼地區中進行實現。
定義延展
@interface MyObject : NSObject
{
NSNumber *number; }
- (NSNumber *)number;
@end @interface MyObject (Setter)
- (void)setNumber:(NSNumber *)newNumber;
@end
@implementation MyObject
- (NSNumber *)number
{
return number;
}
- (void)setNumber:(NSNumber *)newNumber
{!//do something
}
@end
當在定義延展的時候不提供類目名時,延展中定義的方法既被視為“必須實現”的API在這種情況下,如果方法缺少實現代碼,則編譯器會警示告,此時方法的實現必須出現在類主體的@implementation代碼塊中。
3、協議和代理模式
協議只聲明了方法,不具體實現,接受協議的對象負責實現。OC的協議是由@protocol聲明的一組方法列表,要求其它的類去實現,相當於@interface部分的聲明。
注意:
a.確認協議時應實現協議中 @required 修飾的方法
b.可以選擇性實現 @optional 修飾的方法
c.使用[對象 conformsToProtocol:@protocol(Protocol)]判斷是否遵循協議
d.協議寫在提供協議類的.h檔案裡
協議的應用--代理
代理模式即本身不做時間的事情,而是要求其他人去做。
category和extension用來做類擴充的,可以對現有類擴充功能或者修改其功能。在iOS中category應用是非常廣泛的,系統內建的很多類都有多個category擴充功能。一般category中可以定義新的方法、重寫類原來的方法和添加readonly屬性而extension可以認為是匿名的category,但是這個extension相對於category有有一個特殊功能:在extension中可以定義可寫的屬性,公有可讀、私人可寫的屬性(Publicly-Readable, Privately-Writeable Properties)一般這樣實現!1.category的用法2. extension的用法
iOS學習筆記06—Category和Extension
一、概述
類別是一種為現有的類添加新方法的方式。
利用Objective-C的動態運行時分配機制,Category提供了一種比繼承(inheritance)更為簡潔的方法來對class進行擴充,無需建立對象類的子類就能為現有的類添加新方法,可以為任何已經存在的class添加方法,包括那些沒有原始碼的類(如某些架構類)。
二、樣本
1、聲明類別
@interface NSString (CategoryDemo)
-(NSNumber*) lengthAsNumber;
@end
2、實作類別別
@implementation NSString (CategoryDemo)
-(NSNumber*) lengthAsNumber{
NSUInteger length = [self length];
return ([NSNumbernumberWithUnsignedInt: length]);
}
@end
3、調用:
NSMutableDictionary *dic =[NSMutableDictionarydictionary];
[dicsetObject: [@"Hello"lengthAsNumber]forKey:@"hello"];
[dic setObject: [@"World!" lengthAsNumber] forKey: @"world"];
NSLog(@"%@", dic);
4、列印結果:
2012-07-27 17:43:32.993CategoryDemo[2193:f803] {
hello = 5;
world = 6;
}
三、類別的局限性
有兩方面局限性:
(1)無法向類中添加新的執行個體變數,類別沒有位置容納執行個體變數。
(2)名稱衝突,即當類別中的方法與原始類方法名稱衝突時,類別具有更高的優先順序。類別方法將完全取代初始方法從而無法再使用初始方法。
四、類別的作用
類別主要有3個作用:
(1)可以將類的實現分散到多個不同檔案或多個不同架構中,方便代碼管理。也可以對架構提供類的擴充(沒有源碼,不能修改)。
(2)建立對私人方法的前向引用:如果其他類中的方法未實現,在你訪問其他類的私人方法時編譯器報錯這時使用類別,在類別中聲明這些方法(不必提供方法實現),編譯器就不會再產生警告
(3)向對象添加非正式協議:建立一個NSObject的類別稱為“建立一個非正式協議”,因為可以作為任何類的委派物件使用。
四、擴充extension
下面是extension和category的文法樣本:
// extension
@interface MyObject(){
int iextension;
}
-(void)testInExtension;// 類的mainimplementation不實現的話,有編譯警告。
@end
// category
@interface MyObject(categoryDemo){
// int icategory; // error: Ivarsmay not be placed in categories
}
-(void)testInCategory;// 不強制要求在類的mainimplementation中實現
@end
// implementation
@implementation MyObject
//
//-(void)testInExtension{
//
//}
//
//-(void)testInCategory{
//
//}
@end
他們的主要區別是:
1、形式上來看,extension是匿名的category。
2、extension裡聲明的方法需要在mainimplementation中實現,category不強制要求。
3、extension可以添加屬性(變數),category不可以。
ios中的category與extension