Block - 1
2015-10-13 12:28
441 查看
关于Block的一些详细的介绍相信网上的资料非常充分和详细了。不过Block作为iOS里面也算是相当“怪异”的一种存在,所以开一贴从初学到深入地讲解Block,你会发现Block非常灵活强大!
首先来看看Block标准的语法:
语法格式上偏离OC的易读而贴近C的语法。感觉更像一个拥有返回值和参数列表的操作“块”。即函数指针。
接下来看看几种不同的使用:
1.直接地内联使用:
我们来看看方法定义:
通过以上就可以知道原来怪异在这里,dic 的函数方法定义的enumerateKeysAndObjectsUsingBlock: 其实把block作为参数使用,而内敛就是这个意义。
而如果作为参数声明的话,是写语法的前半部分 (返回值)(^ block 标志)(参数列表) ,而在调用使用的时候写的是后半部分 ^ block标志 (参数列表) { block 操作 };
同理,用UIView的静态动画方法时候:
后面的两个block分别是没有返回值和参数的纯操作block。
这也是我们最常用的block使用,在AFNextworking这些非常有名的三方库大量的例子。后续会继续慢慢学习到。
2.使用 NSOperation 的子类 NSBlockOperation 来操作block : (比较小众)
因为现成的接口没有直接执行该block操作,调用的时候就会比较复杂一点:
3.直接声明,直接使用:
这也是block对于OC的语法来说灵活的一个体现!
4.用typedef 声明 作为变量使用, 这个是最灵活最强大的!
用typedef 声明三种具有代表性的block:
定义个一个属性:
使用:
相信非常好理解,是不是很灵活啊!! 这样非常能体现出 block 作为变量的属性,用属性来声明的话,整体类的调用会便捷很多。
其他两个也同理使用,只不过是将普通类型换乘block 或者其他类型罢了。
一个例子:
甚至能更简洁,省略掉调用的时候的空参数:
这两段代码效果完全一样。嘿是不是很炫酷呢, 所以呢,不能完全将block当成一个变量,因为没有变量不声明直接使用的(除了常量)。
另外一个例子:
众所周知,NSArray只可以添加对象,而block就是如此奇异的一种存在,连数组都可以直接添加之。
参考 :
Reference - 1 : 51的教程,非常棒! : http://mobile.51cto.com/hot-403897.htm
Reference - 2 : 总结得很好 ! : http://my.oschina.net/leejan97/blog/268536
Reference - 3 : 深入难度了解 : http://blog.csdn.net/fengsh998/article/details/38090205
Reference - 4 : 总结一流 : http://blog.csdn.net/smking/article/details/8424902
Reference - 5 : cocoa : http://www.cocoachina.com/ios/20150109/10891.html
Reference - 6 : 唐巧的文章 ,很多很多的东西别人都是从唐巧那里取得出来的 :
http://blog.devtang.com/blog/2013/07/28/a-look-inside-blocks/
首先来看看Block标准的语法:
语法格式上偏离OC的易读而贴近C的语法。感觉更像一个拥有返回值和参数列表的操作“块”。即函数指针。
接下来看看几种不同的使用:
1.直接地内联使用:
NSDictionary* dic = [NSDictionary dictionary]; dic = @{@"key1":@"values1", @"key2":@"values2", @"key3":@"values3"}; /** inline Block **/ [dic enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL* stop){ NSLog(@"@value for key : %@ is %@", key, value); }];
我们来看看方法定义:
- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(KeyType key, ObjectType obj, BOOL *stop))block NS_AVAILABLE(10_6, 4_0);
通过以上就可以知道原来怪异在这里,dic 的函数方法定义的enumerateKeysAndObjectsUsingBlock: 其实把block作为参数使用,而内敛就是这个意义。
而如果作为参数声明的话,是写语法的前半部分 (返回值)(^ block 标志)(参数列表) ,而在调用使用的时候写的是后半部分 ^ block标志 (参数列表) { block 操作 };
同理,用UIView的静态动画方法时候:
[UIView animateWithDuration:1 delay:2 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ imageView.frame =CGRectMake(80, 100, 160, 160); } completion:nil];
+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^ __nullable)(BOOL finished))completion NS_AVAILABLE_IOS(4_0);
后面的两个block分别是没有返回值和参数的纯操作block。
这也是我们最常用的block使用,在AFNextworking这些非常有名的三方库大量的例子。后续会继续慢慢学习到。
2.使用 NSOperation 的子类 NSBlockOperation 来操作block : (比较小众)
NSBlockOperation* op = [[NSBlockOperation alloc] init]; [op addExecutionBlock:^{ NSLog(@"Block operation here. "); }];
因为现成的接口没有直接执行该block操作,调用的时候就会比较复杂一点:
3.直接声明,直接使用:
void(^printXAndY)(int , int) = ^(int x, int y){ printf("%d %d\n", x, y); }; printXAndY(123, 456);
这也是block对于OC的语法来说灵活的一个体现!
4.用typedef 声明 作为变量使用, 这个是最灵活最强大的!
用typedef 声明三种具有代表性的block:
typedef void (^BoolBlock)(BOOL); //一个只接受一个BOOL参数,没有返回值的block, BOOL参数名称可以省略 typedef int (^IntBlock)(void); //一个没有参数,返回int的block typedef BoolBlock (^HugBlock) (IntBlock); //参数和返回值都是block的block,从这里可以看出block更像一种类型
定义个一个属性:
@property (nonatomic, strong)BoolBlock testBoolBlock;
使用:
BOOL yyes = YES; self.testBoolBlock = ^(BOOL testValue){ NSLog(@"testValue is : %@", testValue?@"YES":@"NO"); }; self.testBoolBlock(yyes);
相信非常好理解,是不是很灵活啊!! 这样非常能体现出 block 作为变量的属性,用属性来声明的话,整体类的调用会便捷很多。
其他两个也同理使用,只不过是将普通类型换乘block 或者其他类型罢了。
一个例子:
甚至能更简洁,省略掉调用的时候的空参数:
这两段代码效果完全一样。嘿是不是很炫酷呢, 所以呢,不能完全将block当成一个变量,因为没有变量不声明直接使用的(除了常量)。
另外一个例子:
众所周知,NSArray只可以添加对象,而block就是如此奇异的一种存在,连数组都可以直接添加之。
参考 :
Reference - 1 : 51的教程,非常棒! : http://mobile.51cto.com/hot-403897.htm
Reference - 2 : 总结得很好 ! : http://my.oschina.net/leejan97/blog/268536
Reference - 3 : 深入难度了解 : http://blog.csdn.net/fengsh998/article/details/38090205
Reference - 4 : 总结一流 : http://blog.csdn.net/smking/article/details/8424902
Reference - 5 : cocoa : http://www.cocoachina.com/ios/20150109/10891.html
Reference - 6 : 唐巧的文章 ,很多很多的东西别人都是从唐巧那里取得出来的 :
http://blog.devtang.com/blog/2013/07/28/a-look-inside-blocks/
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- Ruby中Block和迭代器的使用讲解
- Ruby中使用Block、Proc、lambda实现闭包
- Ruby中的block、proc、lambda区别总结
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码
- 举例详解iOS开发过程中的沙盒机制与文件
- Android和IOS的浏览器中检测是否安装某个客户端的方法
- javascript实现阻止iOS APP中的链接打开Safari浏览器
- IOS开发第三方语音-微信语音