OC中类别、扩展、协议与托付

类别(category)——通过使用类别,我们能够动态地为现有的类加入新方法。并且能够将类定义模块化地分不到多个相关文件里。通常仅仅在类别中定义方法。

类别,接口部分的定义,通常该文件命名为已有"类+类别名.h"
@interface 已有类 (类别名)
//.......方法实现
@end
比如。考虑为NSNumber添加一个类别,则接口部分代码例如以下
#import <Foundation/Foundation.h>
@interface NSNumber (code)
@end

该类别的实现部分例如以下

#import "NSNumber+code.h"

@implementation NSNumber (code)
-(NSNumber *) add:(double) num
{
    return [NSNumber numberWithDouble:([self doubleValue] +num)];
}
-(NSNumber *) mult:(double) num
{
    return [NSNumber numberWithDouble:([self doubleValue] +num)];
}
@end


全部NSNumber类的实例就都会具有add:、multi:方法。从而实现对NSNumber类的动态扩展。

我们知道。假设一个函数在.h文件里无声明而在.m文件里定义它的实现。那么该方法就是私有方法。仅仅能在本类的文件里使用。若我们在类别的口部分声明这种方法。那么我们就能够实现对该私有方法的訪问。

—————————————————————————————————————————————————————————————————————————————

扩展(extension)

扩展与类别相似,扩展相当于匿名类别。即没有类别名得类别

类别,接口部分的定义,通常该文件命名为已有"类_xxx.h"
@interface 已有类 ()
//.......方法实现
@end

在使用方法上。类别通常都都有单独的.h和.m文件。扩展则是暂时的对某个类进行扩展,类的实现部分同一时候实现类接口部分定义的方法和扩展中定义的方法。定义类的扩展时,能够添加额外的实例变量,也可使用@property和@synthesizekeyword,但在定义类的列表时不同意额外定义实例变量。

有类名为Vehicle,仅仅有name属性未定义方法。

对其进行扩展

#import "vehicle.h"
@interface Vehicle ()
@property(nonatomic, strong) NSString *color;
-(void) drive:(NSString *)name;
@end
为原来的Vehicle类添加color属性和drive:方法。因此在Vehicle.m实现文件中面要实现Vehicle.h里声明的方法及这个drive:方法。

//"Vehicle.m"
#import "Vehicle_ext.h"
@implementation Vehicle
-(void) drive:(NSString *)name
{
    NSLog(@"交通工具名称%@,颜色属性%@",_name,_color);
}
@end
在实际使用中,通用的做法是省略掉Vehicle_ext.h文件,而是将当中的内容直接加入在Vehicle.m文件@implementation前部就可以。

—————————————————————————————————————————————————————————————————————————————

协议(protocol)

类别(catgory)能够实现非正式协议。以NSObject为基础,为NSOject创建类别。创建类别时指定该类新增的方法,这是实现非正式协议的过程。而OC中对于实现非正式协议的类而言,OC并不强制实现该协议中的全部方法 。

正式协议使用@protocolkeyword定义

@protocol 协议名 <父协议1, 父协议2>
{
      //.....方法声明
}
@end
协议是支持多继承的。在OC2.0标准中新增了@required@optional两个keyword,声明方式是必须是必须实现还是可选的,默觉得@required.

遵守协议的语法例如以下

@interface 类名:父类型 <协议1, 协议2...>

使用协议来定义变量。那么这些变量仅仅能调用该协议中声明的方法,否则编译器会提示错误。

使用协议来定义变量的两种语法

NSObject<协议1。协议2..>*变量名;
id<协议1。协议2...> 变量。

协议体现的是一种规范,定义协议的类能够把协议定义的方法托付(delegate)给实现协议的类,这样能够让类具有更好的通用性,详细的动作交给协议的实现类来完毕。在大量的应用程序开发中大量依赖托付这个概念。






原文地址:https://www.cnblogs.com/zfyouxi/p/5283874.html