Block

第一部分:

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写单例的原因。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值