整理Block

用了Block那么久,一直以来没有好好整理,只知道如何使用,对有些概念也不是了解特别清楚,感觉似懂非懂的。借助网上各位前辈的教程,从新疏导一遍,以方便以后自己又犯晕了可以查看。

Block的书写形式

Block变量的声明格式为: 返回值类型(^Block名字)(参数列表);
Block变量的赋值格式为: Block变量 = ^(参数列表){函数体};
对于新手,推荐:使用typedef定义Block类型,因为这种方式可以提高代码的可读性,不至于犯晕。

Block内存形式

我们先来看看一个由C/C++/OBJC编译的程序占用内存分布的结构:


Paste_Image.png

其实,block有三种类型:
* 全局块(_NSConcreteGlobalBlock):存在于全局内存中, 相当于单例.
* 栈块(_NSConcreteStackBlock):存在于栈内存中, 超出其作用域则马上被销毁
* 堆块(_NSConcreteMallocBlock):存在于堆内存中, 是一个带引用计数的对象, 需要自行管理其内存

遇到一个Block,我们怎么这个Block的存储位置呢?

 (1)Block不访问外界变量(包括栈中和堆中的变量)
    Block 既不在栈又不在堆中,在代码段中,ARC和MRC下都是如此。此时为全局块。
 (2)Block访问外界变量
    MRC 环境下:访问外界变量的 Block 默认存储栈中。
    ARC 环境下:访问外界变量的 Block 默认存储在堆中(实际是放在栈区,然后ARC情况下自动又拷贝到堆区),自动释放

block截获变量的类型

block可以中的外部变量一共有五种,依次是全局变量、全局静态变量、局部静态变量、_block修饰的变量和一个局部变量(截获后为const类型)。

ARC 对 block 类型的影响

*  在 ARC下,将只会有 NSConcreteGlobalBlock NSConcreteMallocBlock 类型的 block。
*  原本的 NSConcreteStackBlock 的 block 会被 NSConcreteMallocBlock 类型的 block 替代。

*  针对不同block类型的copy、retain、release操作
   对block不管是retain、copy、release都不会改变引用计数retainCount,retainCount始终是1;
*  针对NSConcreteGlobalBlock:retain、copy、release操作都无效;
*  针对NSConcreteStackBlock:retain、release操作无效
   注意的是,NSConcreteStackBlock离开其作用域后,该block内存将被回收,即使retain也没用。容易犯的错误是  [[mutableAarry addObject:stackBlock],在stackBlock离开其作用域失效后,从mutableAarry中取到的stackBlock已经被回收,变成了野指针。正确的做法是先将stackBlock copy到堆上,然后加入数组:[mutableAarry addObject:[stackBlock copy]]。NSConcreteMallocBlock支持retain、release,虽然retainCount始终是1,但内存管理器中仍然会增加、减少计数。copy之后不会生成新的对象,只是增加了一次引用,类似retain;尽量不要对block使用retain操作。因为从上可以看出,retain操作对NSConcreteStackBlock并没有效果,这样会误以为retain生效了,在后续调用block的时候,其实block早就被释放了,从而导致crash

[参考]
iOS Block 详解
iOS block,你要看的这都有
iOS 中 block 的循环引用问题
iOS 中的 block 是如何持有对象的
深入分析 Objective-C block、weakself、strongself 实现原理
__block与__weak的真正区别
一篇文章看懂 iOS 代码块 Block 字数
谈Objective-C block的实现
神奇的 BlocksKit

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容