OC中协议(Protocol)的小结
来源:互联网 发布:如何应对网络暴力 编辑:程序博客网 时间:2024/05/22 10:48
协议的基础语法
//遵从协议的类,可以声明出遵从协议的对象
Dog * dog = [[Dogalloc]init];
//普通id指针能指向任何对象,带协议的id只能指向遵从协议的类的对象
//Dog类遵从了MyProtocol协议,实现了协议中的方法
id <MyProtocol> obj = dog;
//obj可以使用协议中定义的方法bark
[objbark];
//// main.m// 协议1-基础语法//// Created by Macro on 13-12-12.// Copyright (c) 2013年 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 13-12-12.// Copyright (c) 2013年 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 13-12-12.// Copyright (c) 2013年 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 13-12-12.// Copyright (c) 2013年 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 = [[Bossalloc]init];
//老王遵从协议,并实现协议中声明的方法buyMac
Worker * laowang = [[Workeralloc]init];
//把Boss中delegate指向Worker变量
mars.delegate = laowang;
//相当于: id<BossDelegate> delegate = laowang;
[mars delegateBuyMac];
// 相当于: [delegate buyMac];
//// main.m// 协议2-实现代理//// Created by Macro on 13-12-12.// Copyright (c) 2013年 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 13-12-12.// Copyright (c) 2013年 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 13-12-12.// Copyright (c) 2013年 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 13-12-12.// Copyright (c) 2013年 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 13-12-12.// Copyright (c) 2013年 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 = [[Workeralloc]init];
//Boss实现协议中的方法
Boss * mars = [[Bossalloc]init];
//把Worker中的delegate属性指向Boss
laowang.delegate = mars;
//Worker自定义方法中调用协议中的方法,则Boss实现协议中的方法时,就可以获得Worker传过来的值
[laowang sendMacForNumber:13];
//// main.m// 协议3-传值//// Created by Macro on 13-12-12.// Copyright (c) 2013年 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 13-12-12.// Copyright (c) 2013年 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 13-12-12.// Copyright (c) 2013年 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 13-12-12.// Copyright (c) 2013年 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 13-12-12.// Copyright (c) 2013年 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 = [[DataManageralloc]init];
[dm downloadDataWithURL:@"http://blog.csdn.net/macro_13/"];
sleep(20);//下载需要时间,故需要延时
NSString * ret = [dmreturnContent];
NSLog(@"这是下载的数据:\n%@", ret);
[dm release];
//// main.m// 协议4-回调//// Created by Macro on 13-12-12.// Copyright (c) 2013年 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 13-12-12.// Copyright (c) 2013年 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 13-12-12.// Copyright (c) 2013年 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 13-12-12.// Copyright (c) 2013年 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 13-12-12.// Copyright (c) 2013年 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 13-12-12.// Copyright (c) 2013年 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 13-12-12.// Copyright (c) 2013年 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 13-12-12.// Copyright (c) 2013年 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 13-12-12.// Copyright (c) 2013年 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 13-12-12.// Copyright (c) 2013年 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 13-12-12.// Copyright (c) 2013年 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 13-12-12.// Copyright (c) 2013年 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 13-12-12.// Copyright (c) 2013年 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
- OC中协议(Protocol)的小结
- OC中protocol协议
- oc的协议(protocol)
- OC语法<3.3> OC中特有的语法:Protocol协议
- 【Objective-C】OC中协议(Protocol)的基本概念和用法
- OC 协议(Protocol)的基本概念和用法
- 【OC语法】Protocol协议的介绍
- OC之【@protocol协议】
- 7、协议protocol-OC
- 7、OC Protocol协议
- OC--block,@protocol协议
- OC中的协议protocol
- OC之Protocol (协议)
- 7、OC Protocol协议
- OC协议protocol详解
- OC Protocol(协议)
- OC基础:协议Protocol
- OC--protocol 协议
- 通过div+css做出好看的横排导航栏
- IOS学习笔记55--统计Crash的工具Crashlytics
- Spring之ContextLoaderListener的作用
- ubuntu 14.04 安装 minidwep-gtk, aircrack-ng, reaver 搭建抓包环境
- 外部中断和内部中断
- OC中协议(Protocol)的小结
- cocos2dx V3.2 mac os Xcode6.1 环境配置
- bat文件如何操作打为jar包的Java工程
- 自定义UITextField使TextField文字有缩进效果
- Ubuntu下Adobe Flash Player 安装
- android之为什么使用服务
- Oracle wm_concat的使用
- 普通table表格样式及代码大全(全)
- 不是HR,Leader你会面试应聘者吗(如何起好手中的扑克牌)