概述
让知识更加有价值,欢迎转载
语言:Objective-C、Swift
知识点:
要看重点及使用方法,前面跳过,直接看最后,有swift以及OC代码!
//1. Block的声明、基本用法
//2. __block __weak的原因、用法
//3. Block的传值、回调、网络请求的Block用法
//4. swift中Block的用法
- Block的介绍:
在开发的过程中,我们经常会使用到Block,但是许多人尤其是新手,对于Block有一种畏惧,或者是滥用Block,对于Block的高级用法一知半解,再次将Block讲解一下,包含基础使用,一般使用,以及高级使用
Block给我的感觉就是像是oc中的函数,swift中的function
它能够实现传值,延迟执行,回调,相对于代理来说代码更加集中,简洁,也更强大,很多开源代码中都用到了大量的Block,如AFN,MJ,SD,Swift库中的**Alamafire**等,稍稍掌握Block就能在开发中发挥巨大作用。
- 一、Block的基本使用
//如:
int (^sumOfNumbers)(int a, int b) = ^(int a, int b) {
NSLog{@"%d",a};
return a + b;
};
关于等号右边,才是block的实体,模式为:
//^(传入参数){执行部分};
^(int a, int b) {
return a + b;
};
结构分析:
// Block实体开头是 “^”,接着是由小括号()所包起来的参数列(比如 int a, int b, int c),执行部分,也就是代码处理 由大括号包起来,执行部分return回传值
这时只是确定了block的代码块部分,并没有log信息
需要执行代码:sumOfNumbers(1,3),这时才有log信息
- 二、__block、__weak 的使用方法、原因
// ** 关于 __block **
block还可以访问外界的局部变量,**但是不能修改**如果希望在block中修改的外界局部对象,我们可以给这些变量加上 __block 关键字修饰,这样就能在block中修改这些变量.
举个简单的例子
//代码:
__block index1;
index2;
void (^aBlock)(void) = ^(void) {
index1++;
index2++;
};
aBlock();
NSLog(@"%d,%d",index1,index2)
//log信息,index1增加1,index2没变。
然后,
// ** 关于 __weak **
block捕获变量的机制,使得持有block的对象也可能被block持有,从而形成循环引用,导致两者都不能被释放系统提供给我们__weak的关键字用来修饰对象变量,声明这是一个弱引用的对象
//例子:
__weak typeof(*&self) weakSelf = self;
cycleReferenceBlock = ^{
NSLog(@"%@", weakSelf); //弱指针引用,不会造成循环引用
};
//意思就是,如果你要在Block中使用self,那么最好转化为__weak typeof(self) weakSelf = self;
//防止循环引用
- 三、Block的传值、回调、网络请求的Block用法
//前面已经解释了何为Block
//正题:
//定义一个本地变量的 block Objective-C
//返回值类型 (^block名字)(参数)= ^返回值类型(参数){···}
typedef void(^MYBlock)(int a);
@property (nonamatic,copy)(MYBlock)aBlock;
@property (nonamatic,copy)(MYBlock)bBlock;
@property (nonamatic,copy)(MYBlock)cBlock;
//定义含有block的函数
-(void)doLogNumberA:(int)a andB:(int)b withBlock:(aBlock){
int c = a+b;
aBlock(c);
}
//调用函数
[self doLogNumberA:2 andB:3 withBlock:^(number){
NSlog(@"%d",number); //log - >5
}];
下面举一个Swift具体的例子
//swift声明Block有点特殊,这是Swift2.0的,3.0的还不清楚,不知道改了没有
//一个参数的时候
typealias fucBlock = (参数类型) ->(返回值)
//两个参数的时候
typealias fucBlock = (参数 :类型,参数 :类型) ->(返回值)
Swift实例
typealias MYBlock= (int) ->()
var aBlock : MYBlock
func doLogNumberA:(a:int) andB:(b:int) withBlock:(aBlock){
let c = a+b
aBlock(c)
}
self.doLognumberA:2 andB:3 withBlock:{ number in
print(number)//log - > 5
}
Block总结就到这里,有什么错误欢迎指出,邮箱xoxo_x@126.com
最后
以上就是伶俐饼干为你收集整理的iOS Block总结(从基础到高级)2017.2.5修改的全部内容,希望文章能够帮你解决iOS Block总结(从基础到高级)2017.2.5修改所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复