ios 中的block应用
在这个大冬天里默默敲着键盘,勿喷.今天学习swift过程中,学习到闭包,发现闭包和oc的block中有很多的相同之处,又重新学习了一下并且学习了一些高级点的用法,内容如下:
void(^demoBlock)() = ^ {
NSLog(@"demo Block");
};
int(^sumBlock)(int, int) = ^(int x, int y) {
return x + y;
};
typedef double(^MyBlock)(double, double);
MyBlock area = ^(double x, double y) {
return x * y;
};
MyBlock sum = ^(double a, double b) {
return a + b;
};
NSLog(@"%.2f", area(10.0, 20.0));
NSLog(@"%.2f", sum(10.0, 20.0));
- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block;
而最终的结果却是,除了定义类型之外,EnumerateBlock并没有其他用处
NSArray *array = @[@"张三", @"李四", @"王五", @"赵六"];
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"第 %d 项内容是 %@", (int)idx, obj);
if ([@"王五" isEqualToString:obj]) {
*stop = YES;
}
}];
或者:
MyBlock sumBlock = ^(double x, double y) {
return x * y;
};
- (void)add:(int)number withNumber:(int)withNumber sumBlock:(MyBlock) block
{
NSLog(@"执行add:(int)number withNumber:(int)withNumber sumBlock:(void (^)(void))block");
NSLog(@"hahaha--4和2相乘等于:%f",block(number,withNumber));
}
[self add:4 withNumber:2 sumBlock:sumBlock];
6.既然Block是一种数据类型,那么可以将Block当做比较特殊的对象,添加到数组
#pragma mark 定义并添加到数组
@property (nonatomic, strong) NSMutableArray *myBlocks;
int(^sum)(int, int) = ^(int x, int y) {
return [self sum:x y:y];
};
[self.myBlocks addObject:sum];
int(^area)(int, int) = ^(int x, int y) {
return [self area:x y:y];
};
[self.myBlocks addObject:area];
#pragma mark 调用保存在数组中的Block
int(^func)(int, int) = self.myBlocks[index];
return func(x, y);
7.解除循环引用
__weak DemoObj *weakSelf = self;
int(^sum)(int, int) = ^(int x, int y) {
return [weakSelf sum:x y:y];
};
8.今天重点,参考AFN的框架,block根据函数判断正确与否调用success或者failure函数参数,并传入参数.如下:
//由于主要还是用来判断success和failure函数,所以看着不舒服的同学可以自行脑补,将success换成add,将failure换成multiplied
- (void)viewDidLoad {
[super viewDidLoad];
self.isbool = true;//当isbool等于true的时候就相加,否则就相乘
[self setCompletionBlockWithSuccess:^(int x,int y) {
NSLog(@"相加等于:%d",x+y);
NSLog(@"success");
} failure:^(int x,int y) {
NSLog(@"相乘等于:%d",x*y);
NSLog(@"failure");
}];
}
- (void)setCompletionBlock:(void (^)(void))block {
block();
NSLog(@"setCompletionBlock number2:%d number3:%d",self.number2,self.number3);
}
- (void)setCompletionBlockWithSuccess:(void (^)(int x,int y))success
failure:(void (^)(int x,int y))failure
{
self.completionBlock = ^{
self.number2 = 10;
self.number3 = 20;
if (self.isbool == true) {//判断传入哪个参数,执行success还是failure
NSLog(@"开始相加");
success(self.number2,self.number3);//参数传入setCompletionBlockWithSuccess
}else{
NSLog(@"开始相乘");
failure(self.number2,self.number3);//参数传入setCompletionBlockWithSuccess
}
};
}
9.block遍历
enumerateObjectsUsingBlock:^(id obj, NSUInteger idx,BOOL *stop){ }
ios 中的block应用的更多相关文章
- IOS中的Block与C++11中的lambda
ios中的block 可以说是一种函数指针,但更确切的讲,其实际上其应该算是object-c对C++11中lambda的支持或者说是一个语言上的变体,其实际内容是一样的,C++的lambda我已经有简 ...
- iOS 中使用Block时需要注意的retain circle
现在在ios中,block是越来越多了.自己在类中定义block对象时,需要注意block对象的使用方法,防止产生retain circle,导致内存泄露. 现在分析一下产生retain circle ...
- iOS中使用block进行网络请求回调
iOS中使用block进行网络请求回调 HttpRequest.h // // HttpRequest.h // UseBlockCallBack // // Created by Michael o ...
- iOS中为什么block用copy属性
1. Block的声明和线程安全Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非ARC ...
- iOS 中的 block 是如何持有对象的
Block 是 Objective-C 中笔者最喜欢的特性,它为 Objective-C 这门语言提供了强大的函数式编程能力,而最近苹果推出的很多新的 API 都已经开始原生的支持 block 语法, ...
- iOS开发——高级篇——iOS中为什么block用copy属性
1. Block的声明和线程安全Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非ARC ...
- iOS 中的block异常
转自:iOS 知识小集 我们在调用block时,如果这个block为nil,则程序会崩溃,报类似于EXC_BAD_ACCESS(code=1, address=0xc)异常[32位下的结果,如果是64 ...
- iOS 中的 Block
参考:链接 (1)block作为本地变量(local variable) returnType (^blockName)(parameterTypes) = ^returnType(parameter ...
- iOS 中的block异常 判断block是否为空
我们在调用block时,如果这个block为nil,则程序会崩溃,报类似于EXC_BAD_ACCESS(code=1, address=0xc)异常[32位下的结果,如果是64位,则address=0 ...
随机推荐
- hdu4336 Card Collector 概率dp(或容斥原理?)
题意: 买东西集齐全套卡片赢大奖.每个包装袋里面有一张卡片或者没有. 已知每种卡片出现的概率 p[i],以及所有的卡片种类的数量 n(1<=n<=20). 问集齐卡片需要买东西的数量的期望 ...
- linux 认证方式
- Python中的注释(转)
一.单行注释 单行注释以#开头,例如: print 6 #输出6 二.多行注释 (Python的注释只有针对于单行的注释(用#),这是一种变通的方法) 多行注释用三引 ...
- MPI编程简单介绍
第三章MPI编程 3.1 MPI简单介绍 多线程是一种便捷的模型,当中每一个线程都能够訪问其他线程的存储空间.因此,这样的模型仅仅能在共享存储系统之间移植.一般来讲,并行机不一定在各处理器之间共享存储 ...
- MySQL--索引条件下推优化
http://blog.163.com/li_hx/blog/static/1839914132015782821512/ 一 什么是“索引条件下推” “索引条件下推”,称为 Index Condit ...
- 无需图片,使用CSS3实现圆角按钮[转]
首先来看看效果: 事例HTML代码: <a href="#" class="button green">button</a> < ...
- android 搭建开发环境
法一.直接集成的ADT+ECLIPSE 还有64位的jdk即可 法二.EClipse装好后,下载好SDK,ADT(在线或离线装) sdk下载后,点sdk.exe 文件. 如果更新失败,解决方法如下 C ...
- Java开发核心技术面试心得分析
Java的数据结构有哪些?Map与Set的本质区别是什么? 分析:Java常见的数据结构有Collection和Map,其中Collection接口下包括List和Set接口,其下又有多个实现类如Li ...
- [Java] MAP、LIST、SET集合解析
在JAVA的util包中有两个所有集合的父接口Collection和Map,它们的父子关系: java.util +Collection 这个接口extends自 --java.lang ...
- Java SortedSet接口
该SortedSet的接口扩展集Set并声明了一组按升序排序的行为.除了通过集定义的那些方法中,SortedSet接口声明总结于下表的方法: 有几种方法没有任何条目包含在调用Set的时候抛出一个NoS ...