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型属性delegatedelegate就可以使用buyMac,但不用实现

Boss * mars = [[Bossalloc]init];

//老王遵从协议,并实现协议中声明的方法buyMac

Worker * laowang = [[Workeralloc]init];

//Bossdelegate指向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_requestdelegate指向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




0 0
原创粉丝点击