谈谈你对block的理解

1、block跟swift中的闭包(closure)基本一样,都常用于值的回调,特别是在多线程的网络请求回调中,使用起来极为方便。

 

2、block的开头是“^”,接着是由小括号所报起来的参数列,行为主体由大括号包起来。block有四种类型,分别是无参无返回、无参有返回、有参有返回、以及有参无返回,而一般使用的block都是有参block,因为使用block主要就是进行参数的传递。

 

3、使用block时要特别注意类的循环引用,例如在一个控制器中,self强指针指向一个对象,而这个对象又强指针指向一个block,而在block中,又强指针指向了self,从而造成循环引用,导致内存无法释放,造成内存泄露。

 

4、解决循环应用的方法,常用__weak来打断强引用,例如用__weak来定义一个weakself来指向self的地址,如果self被释放,weakself指向的地址变为nil,从而打断引用环。需要注意的是,__weak是ARC专有的,__unsafe__unretained可以用在ARC,也可以用于MRC,但__unsafe__unretained是“assign”形式,如果指向的对象被释放,其指针地址保持不变,如果继续使用该指针,就会出现“野指针”。

 

5、关于block内存管理,当block内部没有引用外部变量时,block存放在全局区;在MRC下,当block内部引用外部变量时,block存放在栈区;当对该栈区的block进行copy操作时,block将存放在堆区。在ARC下,当block内部引用外部变量时,block存放在堆区;关于堆区与栈区的区别,栈区主要存放局部变量,定义的参数等,在函数结束,系统会自动回收其内存空间,而堆区一般用程序员自行分配释放,若程序员不释放,程序结束时,由系统回收。总的来说,使用栈区更为快捷,而使用堆区更为灵活。

 

6、如果要在block中修改外部变量,当变量是static全局变量时,block可以直接修饰,如果不是,可以用__block关键字来修饰,就可以在block内修改变量的值。

 

 

 7.关于block回调理解描述

  举一个?例子:

 比如我很口渴,但我在忙,需要身边的同事打水一起帮忙打,那么我需要把我的水杯给她,让她去将接水(就相当于我们定义了准备了一个代码块,准备接收了外部要传进来的数据),然后她接过水杯就进行去打水,(这个动作相当于:传递者需要准备一个属性用来接收'接收者'准备好的代码块);将水打好交给我(当拿到数据,将数据传递给接收者,实现回调),那么我接到水杯就可以喝水了(就是相当于:拿到传递者的数据,进行我要实现的操作--"赋值");

 

 

 

为什么在block内部无法修改外部的变量,尤其是栈区?

 

因为block大多数用来做数据传递,需要传递到其他地方调用执行,局部的变量在传递数据的时候容易丢失.

 

 

解决block循环引用方法

 

ARC: 解决block 循环引用问题 —使用__weak修饰self

 

MRC : 解决block 循环引用问题—— 使用__block

 

使用typed声明block

 

typedef void(^didFinishBlock) (NSObject *ob);

 

 这就声明了一个didFinishBlock类型的block,

 然后便可用

 

 

@property (nonatomic,copy) didFinishBlock  finishBlock;

声明一个block对象,注意对象属性设置为copy,接到block 参数时,便会自动复制一份。

 

__block是一种特殊类型,

使用该关键字声明的局部变量,可以被block所改变,并且其在原函数中的值会被改变。

 

 

 

 Block定义成属性为什么选择copy修饰符?

    MRC : Block的本质是函数指针,内存地址在栈区,使用Copy是为了把Block由栈区拷贝到堆区,共享给当前对象使用.

    ARC : Block定义成属性时,使用strong和copy的效果是一样,但是苹果官方建议使用copy.

 

 

 

 使用block和使用delegate完成委托模式有什么优点?

首先要了解什么是委托模式,委托模式在iOS中大量应用,其在设计模式中是适配器模式中的对象适配器,Objective-C中使用id类型指向一切对象,使委托模式在iOS中的实现更为方便。了解委托模式的细节:

 

使用block实现委托模式,其优点是回调的block代码块定义在委托对象函数内部,使代码更为紧凑;

适配对象不再需要实现具体某个protocol,代码更为简洁。

 

 

 多线程与block

 GCD与Block

 使用 dispatch_async 系列方法,可以以指定的方式执行block

 

 GCD编程实力

 

dispatch_async的完整定义

   void dispatch_async(

   dispatch_queue_t queue,

   dispatch_block_t block);

功能:在指定的队列里提交一个异步执行的block,不阻塞当前线程

 

通过queue来控制block执行的线程。主线程执行前文定义的 finishBlock对象

dispatch_async(dispatch_get_main_queue(),^(void){finishBlock();}); 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值