標籤:
類目和延展的作用都是為了擴充一個類。
Objective-C中的類目(Category)
一、類目的定義和作用
類目也叫分類,英文Category,在沒有原類.m檔案的基礎上,給該類添加方法。
比如,NSString類原本沒有helloString方法,我們又沒有NSString類的原代碼,那我們想給NSString類添加一個helloString的方法,只有通過聲明子類或者類目才可以達到這個目的。
二、類目的聲明:
@interfaceNSString (hello)
- (void)helloString;
@end
三、類目實現:
@implementationNSString (hello)
- (void)helloString
{
NSLog(@"my name is %@,I am a string",self);
}
@end
檔案名稱:
NSString+hello.h
使用:
NSString * str = @"我要上天";
[strhelloString];
列印輸出:
my name is 我要上天,I am a string
helloString 實現裡面用到的self就是調用這個方法的執行個體本身。
四、類目使用需要注意的問題:
1、類目裡不能添加執行個體變數,但是類目聲明可以用屬性,其實屬性就是一對兒方法,那麼在.m裡面需要實現這個屬性的setter方法和getter方法,在這兩個實現方法裡面依然不能使用自己添加的執行個體變數。
2、類目裡添加的方法不能和原始類中的方法重名,否則會導致覆蓋。
3、一個類可以添加多個類目,但是類目名和方法名不能重複。
4、類目中的方法可以成為原始類的一部分,和原始類方法層級相同,可以被子類繼承。
局限性: 在類目中只可以為類添加方法,不能添加執行個體變數; 類目中得方法的優先順序要高。
Objective-C中的延展(Extension)
延展也叫Extension:
延展是一種特殊形式的類目,主要是在一個類的.m裡面聲明與實現
延展的作用:就是給某類添加私人方法或私人變數
比如RootViewController.m
@interface RootViewController ()
{
NSString * aString ;
}
- (void)test1;
- (void)test2;
@end
@implementation RootViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNilbundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
@end
上面@interface @end定義的就是一個延展,主要定義了RootViewController的私人方法和私人變數。
五、使用延展需要注意的幾個問題:
1、如果括弧裡沒有類目名,則認為延展裡面的方法為全都必須實現,如果有名,則認為是可選實現。
2、雖然延展是給一個類定義私人方法,但是沒有OC沒有絕對的私人方法,其實還是可以調用,另外延展裡面聲明的變數只能在該類內部使用,外界訪問不了。
3、如果是建立檔案建的某類延展.h檔案,則不能加執行個體變數。
Objective-C中的類目(Category),延展(Extension)