category和extension
一、概述
類別是一種為現有的類新增新方法的方式。
利用objective-c的動態執行時分配機制,category提供了一種比繼承(inheritance)更為簡潔的方法來對class進行擴充套件,無需建立物件類的子類就能為現有的類新增新方法,可以為任何已經存在的class新增方法,包括那些沒有源**的類(如某些框架類)。
二、示例
1、宣告類別
@inte***ce nsstring (categorydemo)
-(nsnumber*) lengthasnumber;
@end 2
、實現類別
@implementation nsstring (categorydemo)
-(nsnumber*) lengthasnumber
@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]
三、類別的侷限性
有兩方面侷限性:
(1)無法向類中新增新的例項變數,類別沒有位置容納例項變數。
(2)名稱衝突,即當類別中的方法與原始類方法名稱衝突時,類別具有更高的優先順序。類別方法將完全取代初始方法從而無法再使用初始方法。
四、類別的作用
類別主要有3個作用:
(1)可以將類的實現分散到多個不同檔案或多個不同框架中,方便**管理。也可以對框架提供類的擴充套件(沒有原始碼,不能修改)。
(2)建立對私有方法的前向引用:如果其他類中的方法未實現,在你訪問其他類的私有方法時編譯器報錯這時使用類別,在類別中宣告這些方法(不必提供方法實現),編譯器就不會再產生警告
(3)向物件新增非正式協議:建立乙個nsobject的類別稱為「建立乙個非正式協議」,因為可以作為任何類的委託物件使用。
四、擴充套件
extension
下面是extension和category的語法示例:
// extension
@inte***ce myobject()
-(void)testinextension;//
類的mainimplementation
不實現的話,有編譯警告。
@end
// category
@inte***ce myobject(categorydemo)
-(void)testincategory;//
不強制要求在類的
mainimplementation
中實現@end
// implementation
@implementation myobject //
//-(void)testinextension
////-(void)testincategory
@end
他們的主要區別是: 1
、形式上來看,
extension
是匿名的
category。2
、extension
裡宣告的方法需要在
mainimplementation
中實現,
category
不強制要求。3、
extension
可以新增屬性(變數),
category
不可以。
ios 類別和擴充套件
類別 inte ce classname categoryname methoddeclarations end 注意事項 1 類別是類的擴充套件,只可以宣告方法,不可以宣告變數。並且,類別的方法優先順序較高,可覆蓋原類方法。2 類別的方法中,不可以呼叫super方法。類別的侷限 3 categor...
ios 類別和擴充套件
類別 inte ce classname categoryname methoddeclarations end 注意事項 1 類別是類的擴充套件,只可以宣告方法,不可以宣告變數。並且,類別的方法優先順序較高,可覆蓋原類方法。2 類別的方法中,不可以呼叫super方法。類別的侷限 3 categor...
類別(分類)和 類拓展
一 分類 類別 作用 擴充套件已有類的功能 1 分類是原來的類增加方法 2 在方法內部可以訪問原有類的成員變數 定義標頭檔案中 步驟 1 為原有類建立乙個分類 2 在分類中增加新的方法的宣告和實現 注意點 1 分類中不能擴充套件原有類的成員變數 2 property在分類中只能生成getter se...