我是靠谱客的博主 伶俐饼干,最近开发中收集的这篇文章主要介绍iOS Block总结(从基础到高级)2017.2.5修改,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

让知识更加有价值,欢迎转载

这里写图片描述
语言: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修改所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部