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); }
相关文章推荐
- ios简单的清除缓存代码
- iOS的系统层级结构和相关的框架
- iOS地图开发-高德地图
- 别在参加iOS培训了,智联背后999+的真实意义
- iOS的socket开发基础
- iOS地图开发-地图的定位
- iOS关于RunLoop和Timer
- iOS解决json串中的NSNull类型
- iOS中几种定时器 - 控制了时间
- iOS地图开发-基本使用
- iOS本地化翻译xliff文件
- SMBIOS
- super,superClass,class
- iOS获取通话状态
- iOS开发之即时通讯之Socket(AsyncSocket)
- iOS入门时常用的一些代码段——字典转模型
- iOS入门时常用的一些代码段——tableviewCell重用
- [IOS]Core Data Model--Demo3
- iOS入门时常用的一些代码段——2
- iOS入门时常用的一些代码段——tabbar 按钮布局