协议的基础语法
//遵从协议的类,可以声明出遵从协议的对象
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