类目:为已知的类(已知的类包括自己定义的类和系统提供的类)增加新的方法;
延展:在自己类的实现中(.m文件中)添加类目来声明私有的方法
协议:协议声明了可以被任何类实现的方法。
注意:这些手段只能增加类的方法,并不能用于增加实例变量,要增加类的实例变量,只能通过定义子类来间接实现。
协议的真正作用就是传值
代理:让两个没有关系的类产生关系
类目 (也叫分类)
通过两部分代码来向原始类添加方法
1、以一个类目名的名义在接口中声明一些方法;
2、同样以类目名的名义在实现文件中定义这些方法的实现:
类目的好处
1、通过类目添加的方法会成为原始类的一部分;
2、通过类目添加的方法和原始类中的方法在使用起来没有任何等级差别;
3、类目里面定义的方法会被原始类的子类所继承;
4、使用类目最大的好处是能扩展被人的实现的类,而且不需要获得原始类的源代码;
类目的局限性
1)无法向类中添加新的实例变量,类目没有位置容纳实例变量
2)名称冲突,当类目中的方法和原始类方法名称冲突使,类别具有更高的优先级,类目方法将完全取代初始方法二无法再使用初始方法
类目的用处
可以扩展别人的类
把代码放到多个文件中;便于多人协作
延展
1)延展使另外一种类目,只不过是将类目写在了类的实现文件中(.m);
2)延展中定义的方法值在implementation代码区中实现;(简而言之,延展就是只将方法写在.m中,这样就变成了私有的方法)
延展说明
1)当定义延展时,如果不提供类目名,那么延展中定义的方法使必须要被实现的,如果缺少实现代码 那么编译器将会报错。
也就是
// 定义延展
@interface Host ()//未提供类目名,-(int)count方法是一定要被实现的
-(int)count;
@end
2)如果指定了类目名,则延展中的方法可以不实现
@interface Host (SayHi)//提供了类目名,-(int)count方法可以不实现
-(int)count;
@end
延展实例代码:(注意延展是写在.m中的)
// 定义延展
@interface Host ()
-(int)count;
@end
// 延展中方法的实现
-(int)count
{
return 5;
}协议
协议里面定义了一堆的方法,这些方法未和任何类未发生关联,它只定义了方法,但不关心具体怎么去实现这些方法。协议就像一个条款,一旦某个对象遵守了协议,那么这个对象就要去实现协议里面的相关方法。
定义协议(假设定义了一个房屋出租协议)
//协议只定义在.h文件,它没有.m文件
#import <Foundation/Foundation.h>
@protocol HouseRentProtocol <NSObject> //定义一个房屋出租的协议
// 必须要实现的协议 用required修饰
@required
-(void)rentHouse:(id)aHost Money:(int)aMoney;
// 可选实现的协议 用optional修饰
@optional
-(void)transWater;
@end
确认协议(假设创建了中介所,这个中介确认了已经定义好的房屋出租协议),所谓确认协议就是实现协议中必须实现的协议(也就是必须实现的方法)
在Agent.h文件中
#import <Foundation/Foundation.h>
#import "HouseRentProtocol.h" //导入协议
// 确认协议 ,注意确认协议的书写格式
@interface Agent : NSObject<HouseRentProtocol> //中介确认房屋出租协议
@end
//这个中介有它的方法(假设中介要做的事情是把房东的房子出租给房客)
//在Agent.m中
#import "Agent.h"
@implementation Agent
-(void)rentHouse:(id)aHost Money:(int)aMoney //renHouse是必须实现的协议 中介把房子出租给房客
{
// ...中介做了很多工作
// ...最终
NSLog(@"%@ %d出租出去了",[aHost name],aMoney);
}
@end
//假设有一个房东,她要出租房子,因此她要找到中介
//在Host.h中
#import <Foundation/Foundation.h>
#import "HouseRentProtocol.h"
@interface Host : NSObject
{
NSString *_name;//房东的姓名
id<HouseRentProtocol> _delegate;//定义了一个代理delegate,这个代理已经确认了协议了 房东在中介注册了一个代理商
}
@property(nonatomic,assign)id delegate;
@property(nonatomic,retain)NSString *name;
-(id)initWithName:(NSString *)aName;
-(void)rentHouse;//房东出租房子
@end
//在Host.m文件中
#import "Host.h"
#import "Host_Private.h"
#import "HouseRentProtocol.h"
@implementation Host
@synthesize name = _name;
@synthesize delegate = _delegate; //房东找的中介代理
-(id)initWithName:(NSString *)aName
{
if (self = [super init])
{
self.name = aName;
}
return self;
}
-(void)dealloc
{
[_name release];
[super dealloc];
}
-(void)rentHouse //房东要把房子租出去
{
//[self house2Count];
NSLog(@"have house to sent");
if ([self.delegate conformsToProtocol:@protocol(HouseRentProtocol)])
{
[self.delegate rentHouse:self
Money:1000];
}
}
//在AppDeleGate.m中
Agent *agent = [[Agent alloc] init]; //中介初始化一个实例
Host *h = [[Host alloc] initWithName:@"包租婆"]; //房东初始化一个实例
// 设置 代理人
h.delegate = agent; //房东设置一个代理
[h rentHouse]; //房东出租房屋,
一个类实现了协议中声明的方法称为确认了该协议,协议需要被其他类所确认,否则这个协议就没有意义了。
协议的特点:
1)可以规范类的行为;
2)利于系统设计
3)利于团队开发等
4)是可选语法,并不是一定要使用协议
用协议代理传值