Block

作者: FunkyRay | 来源:发表于2017-12-04 09:54 被阅读15次

常用写法:

  • OC中:
1.先用typedef声明一个block的名称
typedef void(^CallBackBlock)(int num);
@property (nonatomic, copy) CallBackBlock block;

2.直接定义一个block属性
@property (nonatomic, copy) void(^block1)(void);// 没有参数
@property (nonatomic, copy) void(^block2)(int num);

3.block的调用和实现
self.block1();
self.block1 = ^{
   
};

self.block2(2);
self.block2 = ^(int num) {
   NSLog(@"%d", num);
};
  • Swift中:
1.定义一个block属性
var finishedLoadBack : ((_: Int) -> ())?

2.作为参数的block
func requestData(URLString: String, finishedCallback: @escaping (_ result: Any) -> ())       
  finishedCallback(result)   
}

3.block的调用和实现
if let finishedLoadBack = finishedLoadBack {
  finishedLoadBack(5)
}
finishedLoadBack = {[weak self] num in
  
}

requestData(URLString: url_giftList) { (result) in

}

注意事项:

  • block默认存储在栈中,如果对block进行copy操作,block会转移到堆中;block在栈中访问外界对象不会对对象进行retain操作,block在堆中访问外界对象会对对象进行retain操作。
  • 在block中访问外界 的对象,一定要给对象加上__block,只要加上__block,哪怕block是在堆中,也不会对外界的对象进行retain(在MRC中)。
  • 在block中访问外界的对象,相当于是外界对象作为形参传递进来,只能访问不能修改,是值的传递;给对象加上__block,相当于外界对象把地址传进来,所以可以修改值。
  • copy修饰block,是为了保存block,这样可以保住block中使用的外界对象的命,避免以后调用block时,外界对象已经释放。

解决循环引用的方法:

  • OC中:
    MRC中使用__block,在ARC中使用__weak
  • Swift中:
    block称为闭包,解决方法如下
1.weak var weakSelf : viewController? = self
tool?.loadData { (content) in
    weakSelf?.view.backgroundClolor = UIColor.red
}

2.tool?.loadData { [weak self] (content) in
    self?.view.backgroundClolor = UIColor.red
} // 最好使用的写法

3.tool?.loadData { [unowned self] (content) in
    self.view.backgroundClolor = UIColor.red
} // 前提是self类不会被释放,否则容易造成野指针错误

__block和__weak的区别:

1.在循环引用中:

  • __block本身并不能避免循环引用,避免循环引用需要在block内部把__block修饰的obj置为nil
  • __weak可以避免循环引用,但是其会导致外部对象释放了之后,block内部也访问不到这个对象的问题,我们可以通过在block内部声明一个 __strong的变量来指向weakObj,使外部对象既能在block内部保持住,又能避免循环引用的问题

2.在功能上:

  • __block会持有该对象,即使超出了该对象的作用域,该对象还是会存在的,直到block对象从堆上销毁;而__weak仅仅是将该对象赋值给weak对象,当该对象销毁时,weak对象将指向nil;
  • __block可以让block修改局部变量,而__weak不能。
    另外,MRC__block是不会引起retain;但在ARC__block则会引起retain。所以ARC中应该使用__weak

相关文章

  • iOS开发之Block原理探究

    Block概述 Block本质 Block调用 Block分类 Block循环引用 Block原理探究 Block...

  • block的使用

    定义block 返回类型 (^block名称)(参数) = ^(){block内容}; 调用block block...

  • Block 02 - __block

    Block 02 - __block __block 的作用 __block 可以解决 Block 内部无法修改 ...

  • iOS面试之Block大全

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • iOS面试之Block模块

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • iOS Block

    Block的分类 Block有三种类型:全局Block,堆区Block,栈区Block 全局Block 当Bloc...

  • iOS block 为什么官方文档建议用 copy 修饰

    一、block 的三种类型block 三种类型:全局 block,堆 block、栈 block。全局 block...

  • iOS开发block是用copy修饰还是strong

    Block分为全局Block、堆Block和栈Block1、在定义block没有引用外部变量的时候,block为全...

  • block 初探

    全局block, 栈block, 堆block

  • Block

    一、Block本质 二、 BlocK截获变量 三、__block 修饰变量 四、Block内存管理 五、Block...

网友评论

      本文标题:Block

      本文链接:https://www.haomeiwen.com/subject/jjstixtx.html