OC-10-其他:block、protocol、代理设计模式

----------CornerFly真诚期待与您交流! ----------

一、block

1、作用:Block封装了一段代码,可以在任何时候执行。

2、Blocks的定义

int (^MySum)(int, int) = ^(int a, int b) {
	return a+b;
};

定义了一个叫MySum的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现。

3、利用block封装代码

^(形参){
代码段;
};

4、block访问外面变量

*block内部可以访问外面的变量

*默认情况下,block内部不能修改外面的局部变量

*给局部变量加上__block关键字,这个局部变量就可以在block内部修改。

5、利用typedef定义block类型

typedef int(^MyBlock)(int,int);
MyBlock b1;// 使用MyBlock定义block变量


二、protocol

1、协议的编写

@protocol 协议名称
	// 方法声明列表
@end
@protocol MyProtocol
@required // 加上@required这个方法必须要实现(如果不实现,编译器报错)
- (void)test;// protocol 只能用来声明方法

@optional // 这个方法不一定要实现
- (void)test2;
@end


2、某个类遵守协议

@interface 类名 : 父类 <协议名称>
@end

3、基协议

*NSObject是一个基类,有一个协议,名字也叫NSObject,它是一个基协议。

*建议每个新的协议都要遵守NSObject协议

三、代理设计模式

1、设计原理

 有些麻烦的事情不想自己亲自做,就可以找个人帮忙做,即交给代理对象去做

2、设计原则

*首先得拥有某个代理对象属性

*其次要很清楚代理有哪些方法

*最后要保证能解耦

3、一个人没空,找人帮忙买电影票

#import <Foundation/Foundation.h>
@protocol TicketDelegate
// 返回票价
- (double)ticketPrice;
// 还剩多少张票
- (int)leftTicketNumber;
@end

#import <Foundation/Foundation.h>
#import "TicketDelegate.h"
@interface NextAgent : NSObject
@end

#import <Foundation/Foundation.h>
#import "NextAgent.h"
@implementation NextAgent
// 剩余票数
- (int)leftTicketNumber
{
	// 代理亲自跑电影院\或者打电话
	return 10;
}
// 每一张票多少钱
- (double)ticketPrice
{
	// 代理亲自跑电影院\或者打电话
	return 500;
}
@end

#import <Foundation/Foundation.h>
#import "TicketDelegate.h"
// 负责询问电影票情况的代理
@interface Agent : NSObject
@end
#import <Foundation/Foundation.h>
#import "Agent.h"
@implementation Agent
// 剩余票数
- (int)leftTicketNumber
{
	// 代理亲自跑电影院\或者打电话
	return 1;
}
// 每一张票多少钱
- (double)ticketPrice
{
	// 代理亲自跑电影院\或者打电话
	return 1000;
}
@end

#import <Foundation/Foundation.h>
#import "TicketDelegate.h"
@interface Person : NSObject
- (void)buyTicket;

// 拥有一个代理属性
// 代理的类名随便,必须遵守TicketDelegate协议
@property (nonatomic, retain) id delegate;
@end

#import <Foundation/Foundation.h>
#import "Person.h"
@implementation Person
// 买电影票
- (void)buyTicket
{
	// 叫代理去帮自己买票(询问一下票价,询问一下票的剩余张数)
	double price = [_delegate ticketPrice];
	int number = [_delegate leftTicketNumber];
	NSLog(@"通过代理的帮忙,票价=%d,还剩%d张票", price, number);
}
- (void)dealloc
{
	[_delegate release];
	[super dealloc];
}
@end

import <Foundation/Foundation.h>
#import "Person.h"
#import "Agent.h"
#import "NetAgent.h"
int main ()
{
	autoreleasepool{
	Person *p = [[[Pereson alloc] init] autorelease];

	NextAgent *a = [[[NextAgent alloc] init] autorelease];

	p.delegate = a;
	[p buyTicket];
	}

	return 0;
}
void test()
{
	// 人
	Person *p = [[Pereson alloc] init];
	// 代理
	Agent *a = [[Agent alloc] init];
	// 设置人的代理
	p.delegate = a;

	// 人打算去看电影
	[p buyTicket]; 

	[a release];
	[p release];
}


 


版权声明:本文为wushashawin原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。