标签:
一、block的概念:
别称:代码段,块,闭包,是苹果公司添加到OC语言中的。
作用:在程序运行的过程中保存一段代码,并且这段代码可以进行传递。
应用:用于对象间的通信。
二、block的语法:
和函数指针的语法相似 要设定block的返回值和参数个数及类型。
(1)定义:
无参无返回值的block变量:void (^myBlock)(void)
有参数有返回值的block变量 int (^sumBlock)(int, int);
(2)赋值:
myBlock = ^{ //block中的代码 }; sumBlock = ^(int a, int b) { return a + b; };
(3)调用:
myBlock(); sumBlock(3,4); 如果参数则需要指定实参。
typedef简化block类型的书写:类型名第一个字母要求大写: typedef void (^MyBlock)(void); //定义类型别名MyBlock typedef int (^AthematicBlock)(int, int); //定义类型别名AthematicBlock //可以使用类型别名来定义变量 MyBlock block1; AthematicBlock block2;
三、block内部去访问外面的变量:
默认情况下block内部不能修改外部定义的局部变量。
给局部变量加上__block关键字,这个局部变量可以在block内部修改。
四、block实现对象间通信:(保姆给小孩洗澡)
1.确定在哪里调用block,在哪里传递block
事件在哪里发生(小孩脏了),就在哪里回调block
事件在哪里响应(给小孩洗澡),就在哪里实现并且传递block(给小孩)(灵活处理)
2.调用block的类 Child
应该定义一个block属性,要设置copy的内存管理策略。
并且在事件发生时要调用block
3.传递block的类 Nanny
定义一个block块,此block中的代码就是对这个事件作出的响应。
将此block赋值给调用block的实例对象(小孩)
举例:在小孩类中设定一个block属性,当小孩脏了的时候调用保姆中实现的洗小孩的block的方法,最后在main中让保姆实现洗小孩的方法
child.h
@interface Child : NSObject @property NSInteger cleanValue; //清洁度 @property NSInteger happyValue; //快乐度 //- (void)batheChild:(Child *)child; //定义block类型别名,模仿协议方法的声明 typedef void (^HandleBlock) (Child *); //定义一个block属性(是HandleBlock类型的,名字是washBlock) @property (copy, nonatomic) HandleBlock washBlock; - (instancetype)initWithCleanValue:(NSInteger)cleanValue happyValue:(NSInteger)happyValue; @end
#import "Child.h" @implementation Child - (instancetype)initWithCleanValue:(NSInteger)cleanValue happyValue:(NSInteger)happyValue { self = [super init]; if (self) { NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES]; _cleanValue = cleanValue; _happyValue = happyValue; } return self; } - (void)timerAction:(NSTimer *)timer { _cleanValue--; _happyValue--; NSLog(@"clean:%li, happy:%li", _cleanValue, _happyValue); //当小孩的清洁度下降某个限定值时,通知保姆来给他洗澡 if (_cleanValue == 95) { //调用block,来针对小孩脏了这个事件的处理。 //判断是否调用到了block if (self.washBlock) { self.washBlock(self); } } } @end
@class Child; @interface Nanny : NSObject - (void)washBaby:(Child *)child; @end
#import "Nanny.h" #import "Child.h" @implementation Nanny - (void)washBaby:(Child *)child { child.washBlock = ^ (Child *child){ NSLog(@"小孩脏了,保姆把小孩洗白白"); child.cleanValue = 100; }; } @end
#import "Child.h" #import "Nanny.h" #import "Grandma.h" #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { Nanny *nanny = [[Nanny alloc] init]; Child *child = [[Child alloc] initWithCleanValue:100 happyValue:100]; [nanny washBaby:child]; [[NSRunLoop currentRunLoop] run]; } return 0; }
标签:
原文地址:http://blog.csdn.net/lerryteng/article/details/51362561