ios中的category與extension

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.