首页 > 代码库 > 黑马程序员-2.block块
黑马程序员-2.block块
吐槽:刚开始接触iOS的时候真的挺不适应的,里面出现了很多新玩意,不过还好我比较喜欢新鲜事物,以后整理些iOS中比较新颖的东西。
block就是一个,不过有了block之后省去了上下翻代码的麻烦,很好用,推荐!!
1.Block定义
Block是OC中的一种数据类型,在iOS开发中被广泛使用
^是Block的特有标记,Block的实现代码包含在{}之间
大多情况下,以内联inline函数的方式被定义和使用
Block与C语言的函数指针有些相似,但使用起来更加灵活
示例
void(^demoBlock)() = ^ { NSLog(@"demo Block"); }; int(^sumBlock)(int, int) = ^(int x, int y) { return x + y; };
格式说明:
(返回类型)(^块名称)(参数类型) = ^(参数列表) {代码实现};
如果没有参数,等号后面参数列表的()可以省略
2.当作参数传递
NSArray *array = @[@"刘", @"李", @"张", @"杨"]; [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { NSLog(@"第 %d 项内容是 %@", (int)idx, obj); if ([@"李" isEqualToString:obj]) { *stop = YES; } }];
遍历并NSLog() array中的内容,当obj 为"李"时停止遍历
//函数原型 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { *stop = YES; }];
3.局部变量
int z=10; int(^sumBlock)(int, int) = ^(int x, int y) { z=10; //报错 return x + y +z; };
原因:在block外部的变量,在block中是只读的
解决办法:在变量前加 __block 关键字
4.传递对象
NSString *name=@"李"; NSArray *array = @[@"刘", @"李", @"张", @"杨"]; [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { NSLog(@"第 %d 项内容是 %@", (int)idx, obj); if ([name isEqualToString:obj]) { *stop = YES; } }];
把name传给block块,Block块会自动对指针进行强引用
5.typedef
使用typedef改写官方的数组便利函数
官方的数组遍历方法声明如下: - (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block; 而如果使用typedef,则需要: typedef void(^EnumerateBlock)(id obj, NSUInteger idx, BOOL *stop); 使用时直接写: - (void)enumerateObjectsUsingBlock:(EnumerateBlock)block;
黑马程序员-2.block块
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。