程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Objective-C——擴展(Extension)詳解

Objective-C——擴展(Extension)詳解

編輯:關於C語言

Objective-C——擴展(Extension)詳解


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

(2)在Person.m中實現如下:

 

 

#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

(3)在main.m中實現如下:

 

 

#import 
#import Person.h

int main(int argc, const char * argv[]) {
  @autoreleasepool {
    Person *jack = [[Person alloc] initWithName:@jack];
    [jack print];
    
  }
    return 0;
}

(4)打印結果如下:

 

\

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved