澳门新萄京Category和类扩展

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

 

小编在上一篇博客中详细讲解了Category类别《Objective-C种类(Category)详解》,而扩充和类型又极度的貌似。大家今…

Category

用于给class及其subclass增添新的诀要

有友好单身的 .h 和 .m 文件

用来增加新措施,而不可能增加新属性(property)
种类中加进了成员,编写翻译时能够经过,一切perfect 
等到运维的时候会崩溃,会说找不到艺术,体系中供给动用的积极分子放到 主文件中

主文件中可以self 直接调用类别的艺术

干什么对类进行扩大的feature被称作category?该名称应当浮现了某种初衷,那就是当有些类相比较复杂强大时,大家得以对它的效用(也正是成员函数)实行分拣,况且把它们放入差别的公文加以落到实处。

Extension

Objective-C
2.0过后增添了Extension,所谓的庞大,其实为一个类增添额外的点子或许性质,这几个主意和总体性是私家的。而笔者辈又经常把Extension成为无名的Category。类扩张是在.m文件中宣称私有方法充足好的章程。类扩展中的评释的措施与在类中宣示的艺术是完全一致的,须要在此类的@implementation中落到实处,该措施只在此类内部可知,对外不可知。Extension常被称作是无名氏的Category

用来给类增加新办法,但只遵循于原始类,不成效于subclass

不得不对有implementation源代码的类写Extension,对于没有implementation源代码的类,比如framework
class,是不得以的

Extension能够给原始类增加新措施,以及新属性

我们来轻巧区分一下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的利用,项目中众多都会用的  

#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

参考链接:
和别的的一部分网络能源

类别(Category)

1.什么是Category

Category有很种种翻译: 分类 \ 类别 \ 类目 (一般叫分类)

Category是OC特有的语法, 其余语言未有的语法

Category的作用

能够在不改换原本类的底子上, 为这些类扩张一些方法

三个硕大的类能够分模块开荒

贰个宏大的类能够由多少人来编排,更低价团队合营

项目文件的始建

1.新建文件
2.选择iOS平台Source中的Object-C Fie
3.取舍File Type为Category,则可确立相应类的品类文件

2.Category的格式

在.h文件中证明类别

1)新添长的法子必需写在 @interface 与 @end之间

2)ClassName 现成类的类名(要为哪个类增添方法) + 3)CategoryName
待表明的品类称号

4)NewMethod 新扩充长的艺术

@interface ClassName (CategoryName)

NewMethod; //在类型中增加方法

//不容许在等级次序中增多变量

@end

留神: 1)不容许在宣称类别的时候定义变量

在.m文件中完结项目:

1)新章程的落实必需写在@ implementation与@end之间

2)ClassName 现成类的类名

3)CategoryName 待注解的项目称号

4)NewMethod 新添长的章程的贯彻

@implementation ClassName(CategoryName)

NewMethod

… …

@end

_____________________________________

系列文件的特色

1.类别文本为.h和.m多少个
2.命名为”类名+类别名.h”和”类名+类别名.m”

分类的施用注意事项

分类只可以扩展方法, 不能够充实成员变量

@interface Person (NJ)

{

//    错误写法

//    int _age;

}

– (void)eat;

@end

分拣中写property只会调换方法注明

@interface Person (NJ)

// 只会生成getter/setter方法的宣示, 不会扭转完结和村办成员变量

@property (nonatomic, assign) int age;

@end

分类能够访谈原来类中的成员变量

@interface Person : NSObject

{

int _no;

}

@end

@implementation Person (NJ)

– (void)say

{

NSLog(@”%s”, __func__);

// 能够访问原来类中得成员变量

NSLog(@”no = %i”, _no);

}

@end

假如分类和原本类现身同名的格局, 优先调用分类中的方法,
原来类中的方法会被忽视

@implementation Person

– (void)sleep

{

NSLog(@”%s”, __func__);

}

@end

@implementation Person (NJ)

– (void)sleep

{

NSLog(@”%s”, __func__);

}

@end

int main(int argc, const char * argv[]) {

Person *p = [[Person alloc] init];

[p sleep];

return 0;

}

出口结果:

-[Person(NJ) sleep]

2.分拣的编写翻译的种种

八个分类中有同名方法,则推行最后编写翻译的文书格局(注意开拓中相对不要那样干)

@implementation Person

– (void)sleep

{

NSLog(@”%s”, __func__);

}

@end

@implementation Person (NJ)

– (void)sleep

{

NSLog(@”%s”, __func__);

}

@end

@implementation Person (MJ)

– (void)sleep

{

NSLog(@”%s”, __func__);

}

@end

int main(int argc, const char * argv[]) {

Person *p = [[Person alloc] init];

[p sleep];

return 0;

}

出口结果:

-[Person(MJ) sleep]

主意调用的优先级(从高到低)

分拣(最后出席编译的分类优先)

原来类

父类

____________________________________________________________

1.怎样是类扩张

延展种类又称作扩大(Extendsion),Extension是Category的多少个特例

可感觉有个别类扩展一些私有的积极分子变量和章程

写在.m文件中

克罗地亚共和国语名是Class Extension

2.类增添书写格式

@interface 类名 ()

@end

对待分类, 就少了一个分拣名称,因而也可以有人称它为”佚名分类”

运用格式

.h文件中的格式为

#import "类名.h"

@interface 类名 (类别名)
// 在此处声明方法
@end

.m文件中的格式为

#import "类名+类别名.h"

@implementation 类名 (类别名)
// 在此处实现声明的方法
@end

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图