美文网首页iOS Developer
从堆栈剖析block

从堆栈剖析block

作者: GTReload | 来源:发表于2017-04-12 16:42 被阅读0次

下面的讲解均是在MRC下进行,首先,需设置-fno-objc-arc。

两概念


  • 内存需要手动分配(malloc)和销毁(free)。

  • 一个线程会分配一个stack,里面包含这个函数参数,局部变量,返回地址等信息。当函数返回后,栈会被销毁,有系统操作。 后面再去retain和copy是无效的。
    栈对象有速度的优势,不会发生内存泄漏,

存储区域

通过查看block的isa值,可以看到以下3个名词:

  • NSGlobalBlock 全局
  • NSStackBlock 栈
  • NSMallocBlock 堆

代码演示

//全局block
- (dispatch_block_t)testGlobalBlock {
    dispatch_block_t block = ^(){
        NSLog(@"global block");
    };
    return block;
//或
//    return [block copy];//仍是全局    
}

//栈block
- (dispatch_block_t)testStackBlock {
    __block NSInteger i = 0;
    dispatch_block_t block = ^() {
        NSLog(@"%ld", ++i);
    };
    return block;
}
dispatch_block_t block = [self testStackBlock];
block(); 会crash
dispatch_block_t copyBlock = [block copy];
copyBlock(); 依然crash
//堆 block
- (dispatch_block_t)testMallocBlock {
    __block NSInteger i = 0;
    dispatch_block_t block = ^() {
        NSLog(@"%ld", ++i);
    };
    return [block copy];
}
  • 全局,不访问外部任何变量,copy后仍是全局block;
  • 栈,block里有访问外部变量,函数返回后立即销毁,即使后面strong和copy都会crash;
  • 堆,有栈block拷贝过来,就和OC对象一样,可访问外部变量;

block为什么不用strong

@property (nonatomic, strong) NSString *testStr;
@property (nonatomic, strong) dispatch_block_t strongBlock;

testStr = @"aaa";
- (void)testStackBlock {
    __block NSInteger i = 0;
    //注意此处是self.而不是_strongBlock
    self.strongBlock = ^() {
        NSLog(@"%ld", ++i);
        NSLog(@"%@", _testStr);
    };
    self.copyBlock = ^() {
        NSLog(@"%ld", ++i);
        NSLog(@"%@", _testStr);
    };
}


[self testStackBlock];
_strongBlock(); //堆
_copyBlock(); //堆

栈blog不能访问全局对象,只有堆blog。因为strong和copy均是copy,从语义上更贴切

ARC

在ARC下,即使你声明的修饰符是strong,实际上效果是与声明为copy一样的。因此在ARC情况下,创建的block仍然是NSStackBlock类型,只不过当block被引用或返回时,ARC完成了copy和内存管理的工作。

相关文章

  • 从堆栈剖析block

    下面的讲解均是在MRC下进行,首先,需设置-fno-objc-arc。 两概念 堆内存需要手动分配(malloc)...

  • Block堆栈

  • block的堆栈?

    block究竟放在什么地方:堆\栈? 注:BLOCK被另一个BLOCK使用时,另一个BLOCK被COPY到堆上时,...

  • IOS开发 基础学习

    1、TAG 2、alloc init 3、堆栈 4、atomic、nonatomic 5、__block、__we...

  • iOS Block只持有一个对象

    当一个block块被执行的时候。block会在copy到 堆栈上 。并且代码块里只持有一个对象。所以当block代...

  • Block使用注意点及常见问题浅析

    本文将浅分析几个Block使用问题: 解析问题一:Block作为类变量属性时为啥用copy修饰?堆栈存储位置是怎样...

  • iOS Crash 流程化0:概览

    Ref:iOS Crash 捕获及堆栈符号化思路剖析 iOS Crash 流程化:概览崩溃捕获Mach 异常捕获U...

  • 【iOS基础】block剖析

    导语 block是一些简短代码片段的封装.本质是函数指针. 虽然block声明的时候不带星,而且默认情况下存放在栈...

  • Block深层剖析(五)

    第一篇文章 Block深层剖析(一)[https://www.jianshu.com/p/db4e3e1f1ec1...

  • Block深层剖析(二)

    上一篇文章 Block深层剖析(一)[https://www.jianshu.com/p/db4e3e1f1ec1...

网友评论

    本文标题:从堆栈剖析block

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