Block(块)

定义

带有局部变量(自动变量)的匿名函数

ps :
“带有局部变量”:可以获取到块外面的变量(将变量放在自身(block)的结构体中;获取的只是改变量的瞬时值,后面对变量的修改不会使块中的变量也被修改),但是只能读取;
要改写的话需给变量前面加"__block"修饰符 _(将该变量变成和Block一样的结构体实例,并在自身的结构体添加一个对结构体中值的指针引用;分开两个结构体(block的结构体 , 变量的结构体)是为了能够在多个Block中用到_block变量)

本质

C语言中的结构体和函数,OC语言中对象

语法

^ 返回值类型 参数列表 表达式(斜体代表可省略)

ps:
省略返回值类型时,如果表达式中有return就使用该返回值的类型,如果没有return就使用void类型;表达式中含多个return语句时,所有return的返回值类型必须一致

分类

所属类 说明
栈块 _NSConcreteStackBlock 编译器会给每个块分配好栈内存, 然而等离开了相应的范围之后,编译器有可能把分配给块的内存覆写掉。
堆块 _NSConcreteMallocBlock 带引用计数的块对象;栈块通过copy方法可成为堆块
全局块 _NSConcreteGlobalBlock (存储域为程序的数据区域 .data区) 块不会捕捉任何状态(比如外围的变量等),运行时也无须有状态来参与。块所使用的整个内存区域,在编译期已经完全确定了。

ps:全局块:对其的拷贝操作是个空操作,因为全局块决不可能为系统所目收。这种块实际上相当于单例。下面就是个全局块:

void (^ablock)() = ^{
    NSLog(@"This is a block");

}

由于运行该块所需的全部信息都能在编译期确定,所以可把它做成全局块。这完全是种优化技术:若把如此简单的块当成复杂的块来处理,那就会在复制及丢弃该块时执行

9460be12gw1eyxyexv5omj20zi0t6tdm.jpg

)

从栈到堆

对于Block (用copy方法)

使用场景:向方法或函数的参数中传递Block时
不需手动复制的情况:

  • Cocoa框架的方法且方法名中含有usingBlock时
    
  • GCD的API
    
  • 将block作为函数返回值返回时,将Block赋值给用__strong修饰的id类或Block类型成员变量时,编译器会自动将对象的Block作为参数并调用_Block_copy函数(和copy效果一样)
    
源存储域 复制效果
栈 -> 堆
引用计数增加
程序的数据区域 什么也不做

对于__block变量

跟随Block移动:当一个引用__block变量的Block从栈到堆时,__block变量也从栈到堆,并持有该变量;当有另外一个也引用了该__block变量的Block从栈到堆时,该Block也持有该变量并且该变量引用计数加一,

参考资料:
《Objective-C高级编程》

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

推荐阅读更多精彩内容