当前位置: 移动技术网 > IT编程>开发语言>C/C++ > Objective-C——扩展(Extension)详解

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

2018年10月22日  | 移动技术网IT编程  | 我要评论

珠鳍锦鱼人,麻吹淳子,威颖吧

我在上一篇博客中详细讲解了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)打印结果如下:

 

\

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网