美文网首页
Objective-C——扩展(Extension)详解

Objective-C——扩展(Extension)详解

作者: 栖息于旷野 | 来源:发表于2019-04-03 17:04 被阅读0次

我在上一篇博客中详细讲解了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<foundation foundation.h="">

@interfacePerson : NSObject

- (instancetype)initWithName:(NSString*)aName;

- (void)print;

@property(nonatomic,strong) NSString *name;

@end</foundation>

(2)在Person.m中实现如下:

#importPerson.h

//定义一个Extension;

@interfacePerson ()

//对于普通变量,不能使用strong,retain,copy,只能使用assign;

@property(nonatomic,assign) int age;

//这是可以理解为private 类型的方法;只可以在该类@implementation内部调用;对外部不可见;

- (void)printName;

- (void)printAge;

@end

//类的实现文件;

@implementationPerson

- (instancetype)initWithName:(NSString*)aName

{

  //使用父类的方法来初始化对象;

  self = [superinit];

  if(self) {

    //设置该对象的属性值;

    self.name = aName;

    self.age = 23;

  }

  //这里返回出去的是一个对象;

  returnself;

}

- (void)print{

  NSLog(@Personprint);

  [self printName];

  [self printAge];

}

//实现Extension中定义的方法;

- (void)printName{

  NSLog(@name:%@,self.name);

}

- (void)printAge{

  NSLog(@name:%d,self.age);

}

@end

(3)在main.m中实现如下:

#import<foundation foundation.h="">

#importPerson.h

intmain(intargc, constchar* argv[]) {

  @autoreleasepool{

    Person *jack = [[Person alloc] initWithName:@jack];

    [jack print];

  }

    return0;

}</foundation>

(4)打印结果如下:

相关文章

网友评论

      本文标题:Objective-C——扩展(Extension)详解

      本文链接:https://www.haomeiwen.com/subject/stwzbqtx.html