首页 > 代码库 > 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;
三 代码示例
可以在协议中声明方法(不能声明变量),
某个类只要遵守这个协议,就相当于拥有协议中所有的方法声明。
父类准守协议,子类也拥有协议中的方法。
协议也可以准守另一个协议。
基协议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:协议和代理
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。