iOS开发总结-浅谈Block的内存管理

前言

对于大多数iOS开发人员来说,Block应该并不陌生,iOS4.0已开始支持Block,在编程过程中,Block被Objective-C看成是对象,它封装了一段代码,这段代码可以在任何时候执行。Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它是对C语言的扩展,用来实现匿名函数的特性。
Block的使用很像函数指针,不过与函数最大的不同是:Block可以访问函数以外、词法作用域以内的外部变量的值。
Block的特殊特性方便了开发人员的使用,但是Block的内存需要开发人员自己管理,错误的内存管理会造成循环引用内存泄露,或者内存因为提前释放造成崩溃。
因此,Block的内存管理是很重要的,本文将主要讨论Block使用过程中的内存管理问题。


开发环境
  • Xcode 9正式版
  • ARC
  • 真机调试 iPhone 7 Plus 11.0.1
  • MacBook Pro 10.13

创建代码如下:

//局部变量
- (void)localVar
{
    int localVar = 10;
    NSLog(@"localVar --%p",&localVar);
    sumBlock block1 = ^(int x,int y){
        NSLog(@"localVar --%p",&localVar);
        return localVar + x + y;
    };
    localVar = 0;
    int z = block1(1,2);
    NSLog(@"localVar -- z = %d",z);
}
1.png

打印结果:

2.png
//静态变量
- (void)staticVar
{
    static int staticVar = 10;
    NSLog(@"staticVar --%p",&staticVar);
    sumBlock block2 = ^(int x,int y){
        NSLog(@"staticVar --%p",&staticVar);
        return staticVar + x + y;
    };
    staticVar = 0;
    int z = block2(1,2);
    NSLog(@"staticVar -- z = %d",z);
}
3.png

打印结果:

4.png
//全局变量
- (void)globalVar
{
    NSLog(@"globalVar --%p", &globalVar);
    sumBlock block3 = ^(int x, int y) {
        NSLog(@"globalVar --%p", &globalVar);
        return globalVar + x + y;
    };
    globalVar = 0;
    int z = block3(1, 2);
    NSLog(@"globalVar -- z = %d", z);
}
5.png

打印结果:


6.png
//__block
- (void)blockVar
{
    __block int blockVar = 10;
    NSLog(@"blockVar --%p", &blockVar);
    sumBlock block4 = ^(int x, int y) {
        NSLog(@"blockVar --%p", &blockVar);
        return blockVar + x + y;
    };
    blockVar = 0;
    int z = block4(1, 2);
    NSLog(@"blockVar -- z - %d", z);
}
7.png

打印结果:


8.png
总结
  1. block中的变量是静态或者全局类型时,在block中该变量的内存地址没有发生改变。由于静态变量和全局变量其地址是固定的,因此block在定义的时候并没有复制该变量的值,而是直接从其所在内存中读出。
  2. block中的变量是局部类型时,在block中它的地址都发生了变化,block在定义的时候拷贝了它(开辟了新的内存空间),它在block中是作为常量使用的,其值不受外面的影响。
  3. block中的变量是__block类型时,在block中它的地址都发生了变化,但是blockVar的值受到外界影响,这是因为blockVar在定义变量本身的时候是位于stack上的,而在定义block的时候,该变量并不是被复制了一份,而是编译器将其转移到了heap上,这个地方其实变量是被复制了一份的,并且作为生成的新的结构体的一个成员变量。这个是更深层次的东西,等研究关于__block的原理的东西的时候会有相关介绍。

参考相关资料

iOS开发总结-Block(二)
Block源码解析和深入理解
深入研究Block捕获外部变量和__block实现原理

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

推荐阅读更多精彩内容

  • 《Objective-C高级编程》这本书就讲了三个东西:自动引用计数、block、GCD,偏向于从原理上对这些内容...
    WeiHing阅读 9,787评论 10 69
  • 前言 Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这...
    小人不才阅读 3,751评论 0 23
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,289评论 25 707
  • 下午 草泥马你麻痹还是不明白匝数比和反馈系数草泥马啊 高频实验狗电路图日你哥mutlisim仿真不出结果我勒个槽 ...
    陆海光和阅读 220评论 0 0
  • 《四书章句集注》:愠,纡问反。愠,含怒意。君子,成德之名。尹氏曰:“学在己,知不知在人,何愠之有。”程子曰:“虽乐...
    bodhi1984阅读 2,163评论 0 0