iOS类别、扩展与继承

类别Category

资料摘自:链接1 链接2 

类别是一种为现有的类添加新方法的方式。

利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,无需创建对象类的子类就能为现有的类添加新方法,可以为任何已经存在的class添加方法,包括那些没有源代码的类(如某些框架类)。

二、示例

1、声明类别

@interfaceNSString (CategoryDemo)

-(NSNumber*) lengthAsNumber;

@end

2、实现类别

@implementationNSString (CategoryDemo)

-(NSNumber*) lengthAsNumber{

NSUInteger length = [selflength];

return([NSNumbernumberWithUnsignedInt: length]);

}

@end

3、调用:

NSMutableDictionary *dic =[NSMutableDictionarydictionary];

[dicsetObject: [@"Hello"lengthAsNumber]forKey:@"hello"];

[dic setObject: [@"World!"lengthAsNumber] forKey:@"world"];

NSLog(@"%@", dic);

4、打印结果:

2012-07-27 17:43:32.993CategoryDemo[2193:f803] {

hello = 5;

world = 6;

}

三、类别的局限性

有两方面局限性:

(1)无法向类中添加新的实例变量,类别没有位置容纳实例变量。

(2)名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代初始方法从而无法再使用初始方法。

四、类别的作用

类别主要有3个作用:

(1)可以将类的实现分散到多个不同文件或多个不同框架中,方便代码管理。也可以对框架提供类的扩展(没有源码,不能修改)。

(2)创建对私有方法的前向引用:如果其他类中的方法未实现,在你访问其他类的私有方法时编译器报错这时使用类别,在类别中声明这些方法(不必提供方法实现),编译器就不会再产生警告

代码示例:未运用类别时

iOS类别、扩展与继承_第1张图片

运用类别实现前向引用:

iOS类别、扩展与继承_第2张图片

iOS类别、扩展与继承_第3张图片

iOS类别、扩展与继承_第4张图片

(3)向对象添加非正式协议:创建一个NSObject的类别称为“创建一个非正式协议”,因为可以作为任何类的委托对象使用。

Extension(扩展)非常像是没有命名的类别。

@interface MyClass : NSObject

@property (retain, readonly) float value;

@end

//一般的时候,Extension都是放在.m文件中@implementation的上方。

@interface MyClass ()

@property (retain, readwrite) float value;

@end

使用Extension需要注意的点:

(1)Extension中的方法必须在@implementation中实现,否则编译会报错。

继承

继承是类中的一个重要的特性,他的出现使得我们没必要别写重复的代码,可重用性很高。当然OC中的继承和Java中是一样的,没多大区别,这里在看一个例子吧:

首先来看一下父类:Car

Car.h



21//

//  Car.h

//  06_ExtendDemo

//

//  Created by jiangwei on 14-10-11.

//  Copyright (c) 2014年 jiangwei. All rights reserved.

//

#import

@interface Car : NSObject{

NSString *_brand;

NSString *_color;

}

- (void)setBrand:(NSString *)brand;

- (void)setColor:(NSString *)color;

- (void)brake;

- (void)quicken;

@end

在Car类中定义了两个属性,以及一些方法

Car.m

//car.m


//  06_ExtendDemo

//

//  Created by jiangwei on 14-10-11.

//  Copyright (c) 2014年 jiangwei. All rights reserved.

//

#import "Car.h"

@implementation Car

- (void)setBrand:(NSString *)brand{

_brand = brand;

}

- (void)setColor:(NSString *)color{

_color = color;

}

- (void)brake{

NSLog(@"刹车");

}

- (void)quicken{

NSLog(@"加速");

}

@end

方法的实现

在来看一下子类:

Taxi.h

//  Taxi.h

//  06_ExtendDemo

//

//  Created by jiangwei on 14-10-11.

//  Copyright (c) 2014年 jiangwei. All rights reserved.

//

#import "Car.h"

@interface Taxi : Car{

NSString *_company;//所属公司

}

//打印发票

- (void)printTick;

@end

看到Taxi类继承了父类Car,这里需要导入父类的头文件,然后在Taxi类中多了一个属性和方法

Taxi.m


//  Taxi.m

//  06_ExtendDemo

//

//  Created by jiangwei on 14-10-11.

//  Copyright (c) 2014年 jiangwei. All rights reserved.

//

#import "Taxi.h"

@implementation Taxi

- (void)printTick{

[superbrake];

[self brake];

NSLog(@"%@出租车打印了发票,公司为:%@,颜色为:%@",_brand,_company,_color);

}

@end

你可能感兴趣的:(iOS类别、扩展与继承)