浅谈block

简介: 浅谈block

原有系统的问题

一个NSInteger的普通变量,它所占用的内存与CPU的位数有关,在32为CPU下占4个字节,在64位下占据8个字节,而指针的类型的大小也通常和CPU位数有关,一个指针所占用在32位CPU下为4个字节,在64位下是8个字节

从32位机器迁移到64位机器中,逻辑不变,但是NSNumber,NSDate一类的对象所占用的内存会翻倍

谈谈效率上的问题,为了存储和访问一个NSNum对象,我们需要在对上为其分配内存,另外还需要维护它的引用计数,管理它的生命周期,这些都是给程序增加额外的逻辑,造成运行效率上的损失

Block的解剖

在objective-C中,一共有三种类型的block

1._NSConcreteStackBlock,保存在栈中的block,

当函数返回时会被销毁

2._NSConcreteMallocBlock,保存在堆中的block

当引用计数器为0时会被销毁

3._NSConcreteGlobalBlock,全局静态block,

不会访问任何外部变量

他们之间的区别可以使用clang-rewrite-objc

block.c命令来查看

详细解说block

1.一个block实际就是一个对象,它主要是由一个isa.一个impl和一个descriptor组成

2.在ARC是,block是_NSConcreteGlobalBlock类.

3.impl是实际函数指针,在本例中它指向_main_blick_func_0.

4.descriptor是用于描述当前这个block的附加信息的,包括结构体的大小,需要capture和dispose的变量列表等.结构体大小需要保存的原因是,每个block会capture一些变量,这些变量会加到_main_block_impl0这个结构体中,使其体积变大.

2.block变量的复制

block外的变量引用,block默认是将其赋值其数据结构中来实现访问的,如果对象是一个引用类型,则block会将其引用计数加1

3.对于__block修饰的外部变量引用,bloc是赋值引用地址来实现访问的.

4.避免循环引用

由于block会赋值外部的变量,所以如果不注意,会造成循环引用.对于这种问题,需要将引用的一方编程weak,从而避免循环引用


相关文章
|
缓存 网络协议 算法
Linux内核必读五本书籍(强烈推荐)
Linux内核必读五本书籍(强烈推荐)
1802 0
|
Java 关系型数据库 数据库连接
实时计算 Flink版操作报错之遇到错误org.apache.flink.table.api.ValidationException: Could not find any factory for identifier 'jdbc',该如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
云安全 供应链 监控
|
缓存 算法 网络性能优化
Block Throttle
block throttle 是 block QoS 的重要组成部分,也是最早的一个 QoS,其功能是限制每个 cgroup 的 IOPS/BPS 上限。 ### Group Hiererchy 每个 blkdev 会为每个 block group 创建一个对应的 throttle group ![](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.
2166 2
Block Throttle
|
调度 Python Windows
【python】多任务编程之线程、进程知识点详细总结
【python】多任务编程之线程、进程知识点详细总结
135 0
|
小程序 API 数据库
小程序中读取腾讯文档的表格数据
小程序中读取腾讯文档的表格数据
小程序中读取腾讯文档的表格数据
|
小程序
零基础学小程序 —— 全局配置(四)
零基础学小程序 —— 全局配置(四)
342 0
零基础学小程序 —— 全局配置(四)
|
存储 网络协议 开发者
IDFV+KeyChain(设备唯一标识符)
IDFV+KeyChain(设备唯一标识符)
1324 0
IDFV+KeyChain(设备唯一标识符)
|
Java API
JUC系列(十) | Fork&Join框架 并行处理任务
JUC系列(十) | Fork&Join框架 并行处理任务
230 0
JUC系列(十) | Fork&Join框架 并行处理任务
|
机器学习/深度学习 人工智能
挑战人类认知推理新任务,MIT、UCLA、斯坦福联合提出新一代视觉推理数据集
挑战人类认知推理新任务,MIT、UCLA、斯坦福联合提出新一代视觉推理数据集
205 0
挑战人类认知推理新任务,MIT、UCLA、斯坦福联合提出新一代视觉推理数据集