美文网首页
Block 使用心得

Block 使用心得

作者: 公爵海恩庭斯 | 来源:发表于2017-01-12 11:39 被阅读28次
  1. Block 与 Method 最大的区别在于,Block 能够捕获上下文中的变量;
  2. Block 能够捕获上下文中的变量是有代价的,而这个代价就是:
    • Block 本质上是对象,alloc release 会有额外开销;
    • Block 在使用中,堆 Block 容易引起循环引用问题;栈 Block 容易引起 SIGSEGV;

因为堆 Block 容易引起循环引用问题,所以 UIKit 中使用的是 Action 模式、Delegate 模式等。
因为栈 Block 在非主线程中,容易遇到 SIGSEGV 问题,所以常规方法 封装方法

结论

  1. 在 ViewController - View 层面的接口设计中,应该避免使用 Block,而使用 Action 模式、Delegate 模式等常规 Callback 手段;
  2. 在 ViewModel - ViewController 层面的接口设计中,分为两种情况:
    • ViewModel 是单例,接口需要捕获上下文中的变量。这种情况应该使用 Block, 简化开发,提高可维护性;
    • ViewModel 不是单例,那么与 ViewController - View 的情况是类似的。无论是 ViewController 持有 ViewModel,还是 ViewModel 持有 ViewController,都容易引起循环引用问题,极大的增加开发难度。这种情况不应该使用 Block。

结论

今天又有了新的收获

  1. 如非必要,尽可能少的使用 Block
  2. 在 Block 中访问 self 的实例变量,必须显式声明,避免编译器语法糖导致的循环应用。

Block 中访问实例变量,不显式声明 weakSelf->,会引起循环引用

preferred:
^(NSString *title, NSString *url) {
    NSLog(@"%@", weakSelf->testString)
};
not preferred:
^(NSString *title, NSString *url) {
    NSLog(@"%@", testString)
};

使用 EXTScope,如果不显示声明 self->,也会引起循环引用

preferred:
@weakify(self)
^(NSString *title, NSString *url) {
    @strongify(self);
    NSLog(@"%@", self->testString)
};
not preferred:
@weakify(self)
^(NSString *title, NSString *url) {
    @strongify(self);
    NSLog(@"%@", testString)
};

相关文章

  • Block 使用心得

    Block 与 Method 最大的区别在于,Block 能够捕获上下文中的变量; Block 能够捕获上下文中的...

  • ios block使用

    iOS Block的使用一 .最简单的block使用******使用block的三个步骤:1.定义block变量 ...

  • iOS Block使用注意

    block本质是两个结构体,使用block使代码简单易读。使用Block注意: 1、block内部使用外部指针,会...

  • 白话block

    本文内容 什么是block? block的用途 block的用法 block在使用中遇到的问题 如何使用xcode...

  • iOS Block -浅析 文章

    Block 的使用有两种:1.独立Block 。2.内联Block 。 《一》独立Block 使用方式 一、定义一...

  • Blocks

    使用block修改器 __block

  • iOS_四大传值

    一、目录 属性 传值 单例 传值 block传值 代理 传值 总结 个人使用心得 代码下载地址:https://g...

  • iOS开发--当Block、代理、通知遇到女朋友

    什么是Block? 为什么使用Block? 怎么使用Block? 本文将从这三个问题入手来逐渐了解Block。 本...

  • OC中的block回顾

    1.block声明 2.block的typedef 2.1 typedef的使用 2.2 声明block类型的使用...

  • Block其实很简单

    Block的几种情况 block的使用 1.使用block实现反向传值 2.利用block写响应式编程的技巧

网友评论

      本文标题:Block 使用心得

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