一、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
child.m
#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
nanny.h
@class Child;
@interface Nanny : NSObject
- (void)washBaby:(Child *)child;
@end
nanny.m
#import "Nanny.h"
#import "Child.h"
@implementation Nanny
- (void)washBaby:(Child *)child {
child.washBlock = ^ (Child *child){
NSLog(@"小孩脏了,保姆把小孩洗白白");
child.cleanValue = 100;
};
}
@end
main
#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;
}