基本概念与用法

Objective-C——类别(Category)详解

卷入是面向对象的二个天性,OC也不例外,然则一时大家会遇到这么的场馆,比方自个儿封装了一个类,不想再动它了,然则随着程序作用的增加,要求在老大类中扩张贰个小小的点子,那时大家就不需求在那些类中做修改大概再定义二个子类,只必要在应用那多少个格局时信手增添一个此类的体系(category)就可以。

(1)在档案的次序中定义的办法,会形成原始类中的一局地,与另外格局的调用未有分别;

(2)通过给父类定义类别的艺术,其子类也会一连那个方法。假诺子类增多体系方法,父类则不会有着子类的品种方法;

 

类型方法的利用:

(1)对现存类进行扩展:例如,你能够扩张Cocoa
Touch框架中的类,你在类目中加进的方法会被子类所承继,况且在运维时跟其他的艺术没有区分。

(2)作为子类的替代花招:没有须要定义和动用一个子类,你能够由此品种直接向已部分类扩充方法。

(3)对类中的方法归类:利用category把二个庞然大物的类分开为小块来分别进行支付,进而越来越好的对类中的方法进行翻新和维护。

 

品类方法的局限性:

(1)不或许向品种中加多新的实例变量,连串没有地方来包容实例变量。假使想增添类的实例变量,只好通过定义子类的艺术。

(2)倘诺在档案的次序中覆盖现存类的办法,会挑起super新闻的断裂,因为品种中的方法具备越来越高的事先级。由此,一般不要覆盖现成类中的主意。

 

花色的命名与用法:

品类的命名准则:类名+连串方法,如“NSString+Revert”

花色的接口表明与类的定义非常近乎,但项目不三番五次父类,只须求带有二个括号,申明该品种的主要用途。

 

实质上苹果在设计OC的时候也是使用了类别的思量,最广泛的就是在Foundation框架中。如NSArray所示:

永利皇宫 1

 

永利皇宫 2

 

下边我们透过代码来促成一下Category系列。新建三个Command Line Tools程序。

【扩充自定义的类】(1)新建二个Person类,在Person.h中达成如下:

 

#import 

@interface Person : NSObject

@property(nonatomic,strong) NSString *name;

- (void)test;
- (void)eat;
@end


//有可能我们在同一个类中定义一个Category. 也可以新建一个Category文件;
@interface Person (Creation)
//实例方法
- (id)initWithName:(NSString*)aName;

@end

@interface Person (Life)

- (void)eat;
- (void)sleep;
- (void)play;

@end

(2)在Person.m中完毕如下:

 

 

#import Person.h

@implementation Person

- (void)test{
  NSLog(@这是原有类的一个方法);
}

//会被Category中的同名方法覆盖;
- (void) eat{
  NSLog(@这是原有类的eat);
}

@end


@implementation Person (Creation)

- (id)initWithName:(NSString *)aName{

  self = [super init];
  if (self) {

    self.name = aName;
  }

  return self;
}

@end



@implementation Person (Life)

//当你在原有类中实现一个相同方法的时候,这里会有一个警告。但是在调用的时候,Category中的同名方法会覆盖原有类中的方法;
- (void)eat{
  NSLog(@他需要吃饭);
}

- (void)sleep{
  NSLog(@他需要睡觉);
}

- (void)play{
  NSLog(@他需要玩耍);
}


@end

(3)在main.m中落到实处如下:

 

 

#import 
#import Person.h

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

    Person *jack = [[Person alloc] initWithName:@Jack];
    NSLog(@Person:%@,jack.name);
    [jack test];

    //调用Category中的方法;
    [jack eat];
    [jack sleep];
    [jack play];

  }
  return 0;
}

(4)打印结果如下:

 

永利皇宫 3

 

【扩张系统提供的类】

永利皇宫 ,(1)大家以NSArray类为例,扩张NSArray中的方法。新建三个Convert连串来自于NSArray,方法用来使数组中元素改变局面。在NSArray+Convert.h中落到实处如下:

 

#import 

@interface NSArray (Convert)

//为NSArray增加一个方法;
+ (NSMutableArray*)arrayFromNumber:(int)number;

@end

(2)在NSArray+Convert.m中达成如下:

 

 

#import NSArray+Convert.h

@implementation NSArray (Convert)

+ (NSMutableArray*)arrayFromNumber:(int)number{

  NSMutableArray *numberArray = [[NSMutableArray alloc] init];

  while (number) {

    int last = number % 10;//取出最后一位;
    number /= 10;   //去掉一位;

    [numberArray addObject:[NSNumber numberWithInt:last]];


  }


  return numberArray;
}

@end

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

 

 

#import 
#import NSArray+Convert.h

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

    NSMutableArray *numberArray = [NSArray arrayFromNumber:123];
    for (NSNumber *number in numberArray) {
      NSLog(@number:%@,number);
    }

  }
  return 0;
}

(4)打字与印刷结果如下:

 

永利皇宫 4

 

 

封装是面向对象的二个表征,OC也不例外,不过有个别时候我们会境遇那样的情景,例如小编封装了五个类,不想…

项目(Category)的基本概念

卷入是面向对象的三个特点,OC也不例外,可是有时大家会超越那样的一种景况,比不上本人封装了多个类,

不想再动它了,不过随着程序功效的增加,须求在非常类中扩展二个细微的秘籍,那是我们就不用再非常类中

做修改恐怕在概念多个子类,只供给在接纳的地点随手增多一个此类的连串(Category)就可以。

(1)在档期的顺序中定义的主意,会化为原始类的一有的,与其他措施的调用未有区分。

(2)通过给父类定义体系方法,其子类也会连续这个措施。假诺子类增加种类方法,父类则不会用手子类的类型方法。

网站地图xml地图