OC中协议Protocol的总结

OC中协议Protocol的小结

//协议的基础语法

//遵从协议的类,可以声明出遵从协议的对象

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

Boss * mars = [[Boss alloc] init];

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

Worker * laowang = [[Worker alloc] init];

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