本文介绍: 本章的内容比较麻烦复杂的一章,牵扯到了GCD和Block,在之前也有学习过,本章作以深入的了解多线程问题开发应用程序时候最让人头疼的问题,尤其是线程阻塞,在更新了Mac之后我经常的遇到了彩虹小球的问题,当然在开发时候没有出现过线程阻塞问题。Apple以块和大中枢派发设计了全新的多线程,也就是block和GCD。这是两种不同的技术,但都是一并引入的。块:这个机制方便我们代码对象一样传递,令其在不同的环境运行,而且在定义块的范围可以访问其中的全部变量

前言

GCD和块的简介

37.理解块的概念

块的基础知识
^{
    block implementation 
}

return_type (^block_name)(parameters)

NSString* (^addBlock)(NSString *a, NSString *b) = ^(NSString *a, NSString *b) {
    return [NSString stringWithFormat:@"%@%@", a, b];
};

请添加图片描述
请添加图片描述

可以捕获变量
  • 块可以在它生命的范围里面所有变量都可以捕获。
    请添加图片描述
NSString *c = @"ff";
NSString* (^addBlock)(NSString *a, NSString *b) = ^(NSString *a, NSString *b) {
    return [NSString stringWithFormat:@"%@%@%@", a, b, c];
};
__不允许块属性,仅允许在局部变量__block attribute not allowed, only allowed on local variables

请添加图片描述

内联块的用法
块的内部结构
全局块,栈块,堆块
  • 定义对象的时候是初始分配在栈上的,也就是有可能在使用之后内存被覆写,那样就是产生崩溃
    请添加图片描述
堆块
全局

除了“栈块”和“堆块”之外,还有一类块叫做“全局块”。这种块不会捕捉任何状态比如外围的变量),运行时也无须有状态来参与。而且全局块的copy属于操作可以把他认为是单例

在使用单例模式封装网络请求时候就是使用了全局块
请添加图片描述

要点

38.为常用的块类型创建typedef

typedef int (^EOCSomeBlock)(BOOL flag, int value);

请添加图片描述
如此以来与定义其他变量时一样,变量类型左边变量名右边

要点

39.用handler块降低代码分散程度

协议传值实现异步
块实现异步
回调操作里的块

有时需要在相关事件执行回调操作,这种情况也可以使用handler块。就比如说是下载应用进度条。我们为其添加一观察者,并且在其值发生改变的时候我们调用其中的块。
请添加图片描述

要点

40.用块引用其所属对象时不要出现保留环

块中也存在保留环
  • 如果块所捕获的对象直接或间接的保留了块本身,那么就会出现一种相互引用的现象吗,也就是块中的保留环
    请添加图片描述
  • 保留环主要还是互相引用,尤其是在块的回调部分出现,可能你意识不到的时候就存在了保留环。
  • 只要合适的时候清除掉一方引用,就可以解决问题。
    请添加图片描述

要点

  • 如果块所捕获的对象直接或间接的保留了块本身,那么就得当心保留环问题。
  • 一定要找个适当的时机解除保留环,而不能把责任推给API的调用者

总结

原文地址:https://blog.csdn.net/weixin_61639290/article/details/128790090

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_25542.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注