浅谈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,从而避免循环引用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 摘要block是2010年WWDC苹果为Objective-C提供的一个新特性,它为我们开发提供了便利,比如GCD...
    西门吹雪123阅读 4,459评论 0 4
  • 1. iOS Block用来封装一段代码块或者传递参数相对于代理使用起来方便,它本质上是一个匿名函数。 2.使用b...
    extanstory阅读 2,656评论 0 0
  • 《Objective-C高级编程》这本书就讲了三个东西:自动引用计数、block、GCD,偏向于从原理上对这些内容...
    WeiHing阅读 13,329评论 10 69
  • Block基础回顾 1.什么是Block? 带有局部变量的匿名函数(名字不重要,知道怎么用就行),差不多就与C语言...
    Bugfix阅读 11,724评论 5 61
  • Block 是什么?Block 是一个匿名的函数,但是它能够捕获变量,这是它跟匿名函数的区别。 Block 是如何...
    jeff_guan阅读 3,114评论 0 0