首页 > 代码库 > iOS复习笔记11:协议和代理

iOS复习笔记11:协议和代理

一 功能
可以在协议中声明方法(不能声明变量),
某个类只要遵守这个协议,就相当于拥有协议中所有的方法声明。
父类准守协议,子类也拥有协议中的方法。
协议也可以准守另一个协议。
基协议NSObject(同时也是基类),NSObject基类也准守基协议。
基协议中包含了常用的内存管理方法:release,retain方法等。


二 定义
1 协议定义
@protocal 协议名 <NSObject>
// 声明方法
@end


2 遵守协议
2.1 类
@interface 类名 : 父类名 <协议名1, 协议名2...>
@end


2.2 协议
@protocal 协议名 <协议名1, 协议名2...>
@end


3 关键字
@required 要请实现,不实现有警告
@optional 可选实现


4 定义一个必须准守某个协议的变量
NSObject <协议名> obj1;
id <协议名> obj2;
@property (nonatomic, strong) id <协议名> p;


三 代码示例

// MyProtocal.h
@protocal MyProtocal <NSObject>


- (void)protocolDefaultFun();


@required // 默认值,要求实现,不实现会报警告
- (void)protocolRequiredFun();


@optional // 可选实现
- (void)protocolOptionalFun();


@end

// MulProtocal.h
@protocal MulProtocal <NSObject>


- (void)mulProtocolDefaultFun();


@end

// Person.h
#import <Foundation/Foundation.h>


@protocal MyProtocal;
@protocal MulProtocal;
// 或者 @protocal MyProtocal, MulProtocal;


// 只要一个类准遵守了一个协议,就拥有协议中声明的所有方法
@interface Person : Object <MyProtocal, MulProtocal>


@end


// Person.m
#import "Person.h"
#import "MyProtocal.h"
#import "MulProtocal.h"


@implementation Person <MyProtocal, MulProtocal>


- (void)protocolDefaultFun()
{
	
}


- (void)protocolRequiredFun()
{
	
}


- (void)protocolOptionalFun()
{
	
}


- (void)mulProtocolDefaultFun()
{


}


@end


// main.m
#import <Foundation/Foundation.h>
#import "MyProtocal.h"
#import "Person.h"


int main()
{
	// 声明一个遵守了MyProtocal的对象
	NSObject<MyProtocal>* obj1 = [[Person alloc] init];
	obj1 = nil;
	id<MyProtocal> obj2 = [[Person alloc] init];
	obj2 = nil;


	// 


	return 0;
}


四 代理

// ticketDelegate.h


@protocol ticketDelegate <NSObject>


- (int) leftTicketsNumber;


@end

// Agent.h


@protocol ticketDelegate;


@interface Agent : NSObject <ticketDelegate>


@end


// Agent.m
#import "Agent.h"
#import "ticketDelegate.h"


@implementation Agent


- (int) leftTicketsNumber
{
	return 1;
}


@end

// Person.h


@class Agent;
@class ticketDelegate;


@interface Person : NSObject


- (void)buyTicket;


// 代理属性
@property (nonatomic, retain) id <ticketDelegate> delegate;


@end

// Person.m
#import "Person.h"
#import "Agent.h"


@implementation Person


- (void)buyTicket
{
	if ( _delegate & [_delegate leftTicketsNumber] > 0)
	{
		NSLog(@"buy ticket");
	}
}


@end

// main.m
#import "Person.h"
#import "Agent"


int main()
{
	@autopool{
		Person* p = [[Person alloc]init];
		Agent* a = [[Agent alloc] init];
		p.delegate = a;
		[p buyTicket];
	}
	return 0;
}




iOS复习笔记11:协议和代理