浅谈block

作者: 指尖猿 | 来源:发表于2016-09-27 15:18 被阅读28次

原有系统的问题

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

相关文章

  • ios中Block的深入学习-1

    浅谈block,类中带有Block参数的方法和Block的setting方法的先后顺序和区别 block创建后都在...

  • iOS-Block本质

    iOS-Block本质 参考篇:iOS-Block浅谈[https://www.jianshu.com/p/25a...

  • iOS-Block本质

    参考篇:iOS-Block浅谈 前言:本文简述Block本质,如有错误请留言指正。 第一部分:Block本质 Q:...

  • 浅谈block(一)block源码浅谈

    block例子(测试代码) 在Xcode中创建个工程,如下谢了个简单的例子 切换到工程main.m 目录下,执行c...

  • 浅谈Block

    block的本质 先看下面代码再转成C++代码之后是怎样的,xcrun -sdk iphoneos clang -...

  • 浅谈Block

    前言 block的具体怎么使用我在这里就不一一细说, 我主要说的是关于block三种类型之间的区别, 以及blo...

  • 浅谈block

    这道题目,很多人会认为6,但是答案是3, 其实这边和block关系并不大,主要还是num++和++num之间的差别...

  • 浅谈Block

    Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等。用过GCD就知道Block的精妙之处。...

  • 浅谈block

    原有系统的问题 一个NSInteger的普通变量,它所占用的内存与CPU的位数有关,在32为CPU下占4个字节,在...

  • block浅谈

    block内部不能直接修改外部变量,因为block内部访问外部变量的时候,是以const的方式进行拷贝到block...

网友评论

    本文标题:浅谈block

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