iOS block三种类型

block有如下三种类型:

__NSGlobalBlock __ ( _NSConcreteGlobalBlock )(全局区内存)

__NSStackBlock __ ( _NSConcreteStackBlock )(栈区内存)

__NSMallocBlock __ ( _NSConcreteMallocBlock )(堆区内存)

block在MRC和ARC环境下分别出现这三种类型的情况

MRC环境:

__NSGlobalBlock:没有访问外部auto变量,如果访问了外部static或者全局变量也是这种类型

image

__NSStackBlock:访问了外部auto变量

image

__NSMallocBlock:__NSStackBlock类型调用了copy方法

image

上面就是MRC环境下的三种类型,如果对__NSGlobalBlock和__NSMallocBlock分别调用copy会是什么情况呢?

__NSGlobalBlock调用copy还是__NSGlobalBlock类型,__NSMallocBlock调用copy则引用计数+1

再看下ARC环境下的三种类型:

__NSGlobalBlock:和MRC环境一样,不再累赘

__NSStackBlock:访问了外部变量,但没有强引用指向这个block,而是直接打印出来

image

__NSMallocBlock:ARC环境下只要访问了外部auto变量而且有强引用指向该block(或者作为函数返回值)就会自动将__NSStackBlock类型copy到堆上

image
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容