類目和延展的作用和區別

類目和延展的作用都是為了擴展一個類。
一、類目的定義和作用

  類目也叫分類,英文Category,在沒有原類.m文件的基礎上,給該類添加方法。
  比如,NSString類原本沒有helloString方法,我們又沒有NSString類的原代碼,那我們想給NSString
類添加一個helloString的方法,只有通過聲明子類或者類目才可以達到這個目的。

二、類目的聲明:

@interface NSString (hello)
-(void)helloString;
@end

三、類目實現:

@implementation NSString (hello)
-(void)helloString{
  NSLog(@"my name is %@,I am a string",self);
}
@end
文件名:
  NSString+hello.h
使用:
  NSString *str = @"藍鷗科技";
  [str helloString];
打印輸出:
my name is 藍鷗科技,I am a string
helloString 實現里面用到的self就是調用這個方法的實例本身。

四、類目使用需要注意的問題:

  1、類目里不能添加實例變量,但是類目聲明可以用屬性,其實屬性就是一對兒方法,那么在.m里面需要實現
這個屬性的setter方法和getter方法,在這兩個實現方法里面依然不能使用自己添加的實例變量。
  2、類目里添加的方法不能和原始類中的方法重名,否則會導致覆蓋。
  3、一個類可以添加多個類目,但是類目名和方法名不能重復。
  4、類目中的方法可以成為原始類的一部分,和原始類方法級別相同,可以被子類繼承。

延展也叫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文件,則不能加實例變量。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容