第一部分:
block封装了一段代码,可以在任何时候执行。block本身可以作为函数参数或者函数的返回值,其本身也可以带输入参数或返回值,它和传统的函数指针很类似,但又有区别,block是inline(内联函数)的,并且默认情况下它对局部变量只是可读的。
block类似代理的用法:
1、代理是老板的协议方法委托给它的delegate(秘书)去做。
2、block是一段代码块,block完成代理的作用时逻辑应该是这样的:老板有一个代码块(block),这个代码块让秘书去执行。
3、代理可以传值,当然block代码块也可以携带参数,所以,block也可以传值。
这个例子先完成block的类似代理的作用.
person.h文件:
@interface Person : NSObject
//在这个方法中声明一个block属性,人类有一个发布消息的方法。
@property (nonatomic, copy) void (^buyAHouse)();
+(Person *)defaultInstance;
- (void)publishAMessage;
@end
Person.m文件:
@implementation Person
//单例创建是因为在举例生成对象时确保同一个对象,才能执行其被赋值的代码块。
//人类发布一个消息,执行自身买房的属性。
static Person *defaultInstacne;
+(Person *)defaultInstance{
if (defaultInstacne == nil) {
defaultInstacne = [[Person alloc] init];
}
return defaultInstacne;
}
- (void)publishAMessage{
if (self.buyAHouse) {
self.buyAHouse();//执行block
}
}
@end
IntermediaryAgent.h文件:
@interface IntermediaryAgent : NSObject
- (void)doingBusiness;
@end
IntermediaryAgent.m文件:
#import "IntermediaryAgent.h"
#import "Person.h"
@implementation IntermediaryAgent
//代理商在做生意,来了一个levine的人,代理商为他买房。
- (void)doingBusiness{
Person *levine = [Person defaultInstance];
//这里比较重要,给代码块赋值。
levine.buyAHouse = ^(){
NSLog(@"intermediaryAgent buy a house for levine");
};
}
@end
最后调用:
//注意代码执行的顺序
IntermediaryAgent *intermediaryAgent = [[IntermediaryAgent alloc] init];
[intermediaryAgent doingBusiness];//在这里,代理机构做生意的方法中有给person的block赋值,
Person *person = [Person defaultInstance];
[person publishAMessage];//NSLog(@"intermediaryAgent buy a house for levine");这个输出方法是在这里执行的。
最终输出结果:
2015-09-13 21:16:53.201 MyProtocol[48001:1250003] intermediaryAgent buy a house for levine
要注意的是
1、给代码块赋值必须在执行代码块之前操作。
2、还有,你给一个对象赋值一个代码块,必须由这个对象(其本身)来执行这个代码块,这也是person写单例的原因。