您的位置:首页 > 移动开发 > IOS开发

iOS学习笔记-----Block初探

2016-04-17 14:51 399 查看

Block概要

1.block是一个匿名函数代码块

(1)block声明的时候,就是传值的时候,代码块并没有被运行.
(2)在block回调的时候代码块才被执行.


Block语法

1.Block语法

‘^’托字符 返回值类型(可省略) (参数列表) {表达式}

//1.无参数无返回值的block
^(void){ NSLog(@"--------**^((");}
//2.有参数有返回值的block
^(int a){ return a+1;}


2.Block类型变量

//1.无参数无返回值的block
void (^myBLock1)(void);
//对Blcok类型变量的赋值
myBLock1 = ^(void){

NSLog(@"--------**^((");
};

// block回调
myBLock1();

//2.有参数有返回值的block

int (^sumBlock)(int, int) = ^(int a, int b){

return  a + b;
};

NSLog(@"%d", sumBlock(10, 20));


3.block类型重命名

使用typedef对block类型进行重命名(参数类型和返回值类型,以及有无参数,有无返回值,都会造成block类型)

typedef int (^MathBlock)(int, int);
MathBlock sumBlock;
sumBlcok = ^(int a,int b){return a +b ;};


4.__block关键字

block里的代码块修改block外面的变量,需要加上关键字__block,这个值在外面访问也是访问到已经被改变的值

int main(int argc, const char * argv[]) {
@autoreleasepool {

typedef float (^MyBlock) (float, float);
MyBlock multiBlock;
// block外面定义变量
__block int c = 10;
multiBlock = ^(float a, float b){

c--;
NSLog(@"c = %d", c);
return a * b;
};

NSLog(@"c = %d", c);

float result = multiBlock(2.5, 3.0);
NSLog(@"result = %f", result);

NSLog(@"c = %d", c);
/*打印结果为:c = 10
c = 9
c = 9
*/


Blocjk简单用法

1.block遍历数组与字典

// block遍历数组
NSArray *array = @[@"hello", @"world", @"!!!"];
[array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

if(idx == 1) {

*stop = YES;
}

NSLog(@"%lu   %@", idx, obj);
}];

// block遍历字典
NSDictionary *dic = @{
@"key" : @"value",
@"name" : @"salary",
@"menpai" : @"wudan"
};

[dic enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {

NSLog(@"key:%@ value:%@", key, obj);

}];

}
return 0;
}


2.block实现对象间通讯

事件:小孩变脏,需要保姆照顾

回顾代理设计模式:
(1)产生事件的对象:小孩
(2)响应事件的对象:保姆
(3)保姆签协议:实现方法
(4)小孩要设置代理对象

block实现对象间通信要点
(1)产生事件的对象:一,要有block属性 二,谁产生事件谁回调block
(2)响应事件的对象:谁响应事件谁传递block


关键代码:

(1)在产生事件的对象中定义Block属性

typedef void(^HandleChildBlock)(Child *);

@property(nonatomic, assign) NSInteger cleanValue;
// block的内存管理方式用copy
@property(nonatomic, copy) HandleChildBlock washBlock;


(2)在影响事件的对象中给Block赋值

- (void)washChild:(Child *)child {

// 功能是把小孩的清洁值变为100

child.washBlock = ^(Child *ch){

NSLog(@"保姆给小孩洗白白");
ch.cleanValue = 100;

};


(3)在产生事件的对象中回调Block

if(self.washBlock){

_washBlock(self);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: