標籤:objective-c ios delegate
一 功能
可以在協議中聲明方法(不能聲明變數),
某個類只要遵守這個協議,就相當於擁有協議中所有的方法聲明。
父類准守協議,子類也擁有協議中的方法。
協議也可以准守另一個協議。
基協議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:協議和代理