我在上一篇博客中詳細講解了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; }
。