//协议的基础语法
//遵从协议的类,可以声明出遵从协议的对象
Dog * dog = [[Dog
alloc] init];
//普通id指针能指向任何对象,带协议的id只能指向遵从协议的类的对象
//Dog类遵从了MyProtocol协议,实现了协议中的方法
id <MyProtocol> obj = dog;
//obj可以使用协议中定义的方法bark
[obj
bark];
// // main.m // 协议1-基础语法 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import <Foundation/Foundation.h> #import "Dog.h" int main(int argc, const char * argv[]) { @autoreleasepool { //协议的基础语法 //遵从协议的类,可以声明出遵从协议的对象 Dog * dog = [[Dog alloc] init]; //普通id指针能指向任何对象,带协议的id只能指向遵从协议的类的对象 //Dog类遵从了MyProtocol协议,实现了协议中的方法 id <MyProtocol> obj = dog; //obj可以使用协议中定义的方法bark [obj bark]; [dog release]; } return 0; }
// // Protocol.h // 协议-1 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import <Foundation/Foundation.h> @protocol MyProtocol <NSObject> //协议是可以继承的 Protocol协议继承了NSObject协议 //遵从了Protocol协议就同时遵从了NSObject协议 //在协议中声明方法,凡是遵从(conform)协议的类会出卖相同接口的方法 -(void)bark; @end
// // Dog.h // 协议-1 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import <Foundation/Foundation.h> #import "MyProtocol.h" @interface Dog : NSObject <MyProtocol> //Dog类遵从协议,出卖协议上的方法 -(void)bark;//叫 (出卖) -(void)run; @end
// // Dog.m // 协议-1 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import "Dog.h" @implementation Dog -(void)bark { NSLog(@"Won!"); } -(void)run { NSLog(@"Run"); } @end
//用协议实现代理
//Boss要调用Worker中的方法(Boss—>Worker)
//协议可以单独文件定义,也可以定义在委托方的声明文件中(.h)
//协议中定义了方法buyMac
//Boss中有个带协议的id型属性delegate,delegate就可以使用buyMac,但不用实现
Boss * mars = [[Boss
alloc] init];
//老王遵从协议,并实现协议中声明的方法buyMac
Worker * laowang = [[Worker
alloc] init];
//把Boss中delegate指向Worker变量
mars.delegate = laowang;
//相当于: id<BossDelegate> delegate = laowang;
[mars delegateBuyMac];
// 相当于: [delegate buyMac];
// // main.m // 协议2-实现代理 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import <Foundation/Foundation.h> #import "Boss.h" #import "Worker.h" int main(int argc, const char * argv[]) { @autoreleasepool { //用协议实现代理 //协议可以单独文件定义,也可以定义在委托方的声明文件中(.h) //协议中定义了方法buyMac //Boss中有个带协议的id型属性delegate,delegate就可以使用buyMac,但不用实现 Boss * mars = [[Boss alloc] init]; //老王遵从协议,并实现协议中声明的方法buyMac Worker * laowang = [[Worker alloc] init]; //把Boss中delegate指向Worker变量 mars.delegate = laowang; //相当于: id<BossDelegate> delegate = laowang; [mars delegateBuyMac]; // 相当于: [delegate buyMac]; [mars release]; [laowang release]; } return 0; }
// // Boss.h // 协议2-实现代理 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import <Foundation/Foundation.h> //协议可以声明于委托方的头文件中 @protocol BossDelegate <NSObject> //协议中规定 被委托的方法 买MAC - (void)buyMac; @end @interface Boss : NSObject //指向代理的指针,若引用(assign) @property (assign) id <BossDelegate> delegate; //委托代理替自己买MAC -(void)delegateBuyMac; @end
// // Boss.m // 协议2-实现代理 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import "Boss.h" @implementation Boss //委托代理替自己买MAC -(void)delegateBuyMac { //代理指针指向worker [self.delegate buyMac]; //id指针调用协议上的方法 } @end
// // Worker.h // 协议2-实现代理 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import <Foundation/Foundation.h> #import "Boss.h" @interface Worker : NSObject <BossDelegate> //worker遵从协议,出卖了协议上的方法 即买MAC的方法 //采购MAC //- (void)buyMac; @end
// // Worker.m // 协议2-实现代理 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import "Worker.h" @implementation Worker //采购MAC - (void)buyMac { NSLog(@"Worker采购了一批MAC!"); } @end
//用协议实现传值
//Worker要传送数据给Boss(Worker-->Boss)
//协议中定义了方法numOfMacBooksRise:(NSUInteger)rise;rise是要传送的数据
//Worker中有个带协议的id型属性delegate,delegate可以调用numOfMacBooksRise:方法
Worker * laowang = [[Worker
alloc] init];
//Boss实现协议中的方法
Boss * mars = [[Boss
alloc] init];
//把Worker中的delegate属性指向Boss
laowang.delegate = mars;
//Worker自定义方法中调用协议中的方法,则Boss实现协议中的方法时,就可以获得Worker传过来的值
[laowang sendMacForNumber:13];
// // main.m // 协议3-传值 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import <Foundation/Foundation.h> #import "Worker.h" #import "Boss.h" int main(int argc, const char * argv[]) { @autoreleasepool { //用协议实现传值 //Worker要传送数据给Boss(Worker-->Boss) //协议中定义了方法numOfMacBooksRise:(NSUInteger)rise;rise是要传送的数据 //Worker中有个带协议的id型属性delegate,delegate可以调用numOfMacBooksRise:方法 Worker * laowang = [[Worker alloc] init]; //Boss实现协议中的方法 Boss * mars = [[Boss alloc] init]; //把Worker中的delegate属性指向Boss laowang.delegate = mars; //Worker自定义方法中调用协议中的方法,则Boss实现协议中的方法时,就可以获得Worker传过来的值 [laowang sendMacForNumber:13]; [mars release]; [laowang release]; } return 0; }
// // Boss.h // 协议3-传值 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import <Foundation/Foundation.h> #import "Worker.h" @interface Boss : NSObject <WorkerDelegate> { //Mac总数 NSUInteger _numOfMacBooks; } //自带增长本的个数 - (void) numOfMacBooksRise:(NSUInteger)rise;//被动 @end
// // Boss.m // 协议3-传值 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import "Boss.h" @implementation Boss //自带增长本的个数 - (void) numOfMacBooksRise:(NSUInteger)rise { _numOfMacBooks += rise; NSLog(@"Mars的本增长了%lu, 共有%lu", rise, _numOfMacBooks); } - (instancetype)init { self = [super init]; if (self) { _numOfMacBooks = 0; } return self; } @end
// // Worker.h // 协议3-传值 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import <Foundation/Foundation.h> @protocol WorkerDelegate <NSObject> - (void)numOfMacBooksRise: (NSUInteger)rise; @end @interface Worker : NSObject @property (assign) id<WorkerDelegate> delegate; //发送一定量的本 -(void)sendMacForNumber:(NSUInteger)num; @end
// // Worker.m // 协议3-传值 //2 // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import "Worker.h" @implementation Worker //发送一定量的本 -(void)sendMacForNumber:(NSUInteger)num { NSLog(@"老王发送了Mac%lu台", num); [self.delegate numOfMacBooksRise:num]; } @end
//协议实现回调
//MHRequest类中定义了协议MHRequestDelegate,并有一个遵从协议的id型属性delegate
//此外MHRequest中还有一个开辟线程启动下载的方法,下载完毕后会调用协议中的方法
//DataManaget类中有一个MHRequest的成员对象_request,_request的delegate指向DataManager自身
//当DataManager需要下载数据时,就调用_request中的下载方法
//同时DataManger还实现了协议中的方法,从协议中的方法中可以获得下载的数据
//再添加一个方法和属性就可以返回下载的数据
DataManager * dm = [[DataManager
alloc]
init];
[dm downloadDataWithURL:@"http://blog.csdn.net/macro_13/"];
sleep(20);//下载需要时间,故需要延时
NSString * ret = [dm
returnContent];
NSLog(@"这是下载的数据:\n%@", ret);
[dm release];
// // main.m // 协议4-回调 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import <Foundation/Foundation.h> #import "DataManager.h" int main(int argc, const char * argv[]) { @autoreleasepool { //协议实现回调 //MHRequest类中定义了协议MHRequestDelegate,并有一个遵从协议的id型属性delegate //此外MHRequest中还有一个开辟线程启动下载的方法,下载完毕后会调用协议中的方法 //DataManaget类中有一个MHRequest的成员对象_request,_request的delegate指向DataManager自身 //当DataManager需要下载数据时,就调用_request中的下载方法 //同时DataManger还实现了协议中的方法,从协议中的方法中可以获得下载的数据 //再添加一个方法和属性就可以返回下载的数据 DataManager * dm = [[DataManager alloc] init]; [dm downloadDataWithURL:@"http://blog.csdn.net/macro_13/"]; sleep(20);//下载需要时间,故需要延时 NSString * ret = [dm returnContent]; NSLog(@"这是下载的数据:\n%@", ret); [dm release]; } return 0; }
// // DataManager.h // 协议4-回调 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import <Foundation/Foundation.h> #import "MHRequest.h" @interface DataManager : NSObject <MHRequestDelegate> @property (copy) NSString * content; -(void) downloadDataWithURL:(NSString *)url; - (NSString *)returnContent; @end
// // DataManager.m // 协议4-回调 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import "DataManager.h" #import "MHRequest.h" @implementation DataManager { MHRequest * _request; } -(instancetype) init { if (self = [super init]) { _request = [[MHRequest alloc] init]; _request.delegate = self; } return self; } -(void)dealloc { [_request release]; self.content = nil; [super dealloc]; } -(void) downloadDataWithURL:(NSString *)url { //dataManager不会下载,可以通过自己的成员替自己下载 [_request requestForURL:url]; //如果这个方法中不开线程,那么这个方法返回时就是下载完成的时候 //开线程,只要线程一开,主线程继续执行,这个方法返回时也不一定下载完毕 } //数据下载完成后会自动调用这个函数 -(void)requestDidFinished:(NSData *)data { //data就是下载到的数据 //dataManager可以将下一步操作写在这里 //解析数据 NSString * str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; // NSLog(@"下载到数据:\n%@", str); self.content = str; [str release]; // NSLog(@"%@", self.content); NSLog(@"数据下载完成"); } - (NSString *)returnContent { return self.content; } @end
// // MHRequest.h // 协议4-回调 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import <Foundation/Foundation.h> @protocol MHRequestDelegate <NSObject> - (void)requestDidFinished:(NSData *)data; @end /**请求类,其对象用于开辟线程异步下载数据*/ @interface MHRequest : NSObject @property (assign) id <MHRequestDelegate> delegate; //本地或者远程数据资源 -(void)requestForURL:(NSString *)url; @end
// // MHRequest.m // 协议4-回调 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import "MHRequest.h" @implementation MHRequest -(void)requestForURL:(NSString *)url { //开一个子线程下载数据 NSThread * thread = [[NSThread alloc] initWithTarget:self selector:@selector(download:) object:url]; //让子线程执行 [thread start]; } - (void)download:(NSString *)url { NSData * data = [NSData dataWithContentsOfURL: [NSURL URLWithString:url]]; sleep(arc4random() % 5 + 5); [self.delegate requestDidFinished:data]; } @end
//协议实现多继承
// // main.m // 协议5-多继承 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import <Foundation/Foundation.h> #import "IOSStudent.h" #import "AndroidStudent.h" int main(int argc, const char * argv[]) { @autoreleasepool { NSMutableArray * array = [[NSMutableArray alloc] init]; Class classArray[] = {[IOSStudent class],[AndroidStudent class]}; NSArray * names = @[@"Kitty", @"Alice", @"Ferry", @"Alen", @"Merry", @"Ben"]; for (NSInteger i = 0 ; i < [names count]; i++) { id obj = [[classArray[arc4random() % 2] alloc] init];//随机定义对象 [obj setName:names[i]];//设置name [obj setAge:arc4random() % 20 + 10];//随机设置年龄 [array addObject:obj]; [obj release]; } //根据年龄将学生排序,注:array中是不同类的对象 [array sortUsingSelector:@selector(youngerThanStudent:)]; for (id stu in array) { NSLog(@"%@", stu); } [array release]; } return 0; }
// // StuProtocol.h // 协议5-多继承 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import <Foundation/Foundation.h> @protocol StuProtocol <NSObject> @property NSUInteger age; - (BOOL)youngerThanStudent:(id <StuProtocol>)stu; @end
// // Student.h // 协议5-多继承 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import <Foundation/Foundation.h> @interface Student : NSObject @property NSUInteger age; - (BOOL)youngerThanStudent:(Student *)stu; @end
// // Student.m // 协议5-多继承 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import "Student.h" @implementation Student - (BOOL)youngerThanStudent:(Student *)stu { return self.age < stu.age; } @end
// // AndroidStudent.h // 协议5-多继承 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import <Foundation/Foundation.h> #import "StuProtocol.h" #import "Student.h" @interface AndroidStudent : Student <StuProtocol> @property (copy) NSString * name; //@property NSUInteger age; @end
// // AndroidStudent.m // 协议5-多继承 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import "AndroidStudent.h" @implementation AndroidStudent - (void)dealloc { self.name = nil; [super dealloc]; } - (NSString *)description { return [NSString stringWithFormat:@"方向:Android 姓名:%@ 年龄:%lu", self.name, self.age]; } //- (BOOL)youngerThanStudent:(id<StuProtocol>)stu //{ // return self.age < stu.age; //} @end
// // IOSStudent.h // 协议5-多继承 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import <Foundation/Foundation.h> #import "StuProtocol.h" #import "Student.h" @interface IOSStudent : Student <StuProtocol> @property (copy) NSString * name; //@property NSUInteger age; @end
// // IOSStudent.m // 协议5-多继承 // // Created by Macro on 14-12-12. // Copyright (c) 2014年 Macro. All rights reserved. // #import "IOSStudent.h" @implementation IOSStudent - (void)dealloc { self.name = nil; [super dealloc]; } - (NSString *)description { return [NSString stringWithFormat:@"方向:IOS 姓名:%@ 年龄:%lu", self.name, self.age]; } //- (BOOL)youngerThanStudent:(id<StuProtocol>)stu //{ // return self.age < stu.age; //} @end