我在上一篇博客中詳細講解了Category類別《Objective-C——類別(Category)詳解》,而擴展和類別又十分的相似。我們今天就來深入學習擴展。
Objective-C 2.0之後增加了Extension,所謂的擴展,其實為一個類添加額外的方法或者屬性,這些方法和屬性是私有的。而我們又常常把Extension成為匿名的Category。類擴展是在.m文件中聲明私有方法非常好的方式。類擴展中的聲明的方法與在類中聲明的方法是完全一致的,需要在該類的@implementation中實現,該方法只在該類內部可見,對外不可見。
我們來簡單區分一下Category類別和Extension擴展的區別:
(1)從某個類新建一個Category,會生成類名稱+Category名稱.h和類名稱+Category名稱.m兩個文件;而從某個類新建一個Extension,只會生成一個類名稱_Extension.h一個文件。
(2)Category中不可以定義屬性或者變量;而Extension中可以定義屬性或者變量。
(3)在Category中定義的方法可以被子類繼承;而Extension中定義的方法和屬性不能被子類繼承,因為它們是private的。
(4)Category可以對自定義的類或者framework框架中的類增加方法;而Extension只能對自定義的類進行增加方法,因為你無法在框架類的實現文件中實現這些增加的方法,畢竟OC不是開源的,這些代碼不可見。
(5)Category的名字是@interface 類名(Category名稱),@implementation 類名(Category名稱);而Extension名字只有@interface 類名();
(6)可以把Extension理解為特殊的Category;
我們通過代碼來實現一下Extension:
(1)定義Person類,在Person.h中實現如下:
#import@interface Person : NSObject - (instancetype)initWithName:(NSString*)aName; - (void)print; @property(nonatomic,strong) NSString *name; @end
#import Person.h //定義一個Extension; @interface Person () //對於普通變量,不能使用strong,retain,copy,只能使用assign; @property(nonatomic,assign) int age; //這是可以理解為private 類型的方法;只可以在該類@implementation內部調用;對外部不可見; - (void)printName; - (void)printAge; @end //類的實現文件; @implementation Person - (instancetype)initWithName:(NSString*)aName { //使用父類的方法來初始化對象; self = [super init]; if (self) { //設置該對象的屬性值; self.name = aName; self.age = 23; } //這裡返回出去的是一個對象; return self; } - (void)print{ NSLog(@Person print); [self printName]; [self printAge]; } //實現Extension中定義的方法; - (void)printName{ NSLog(@name:%@,self.name); } - (void)printAge{ NSLog(@name:%d,self.age); } @end
#import#import Person.h int main(int argc, const char * argv[]) { @autoreleasepool { Person *jack = [[Person alloc] initWithName:@jack]; [jack print]; } return 0; }
。