简书三体组织

Blcok相关经典面试题

2020-03-11  本文已影响0人  a295ff153449

题目:事例分析Block在ARC和MRC情况下的使用。

typedef void(^eBlock)(void);

/*
 栈:函数体中定义的自动变量  系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活  由编译器自动分配释放
 堆:用malloc,calloc,realloc等分配内存的函数分配得到的就是在堆上  是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率有一定降低。一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
 以下代码在arc中有问题吗?
 
 arc 没问题
 mrc 此种写法会有内存安全隐患 直接返回使用 return b;
 i和b  均为局部变量  出了作用域会被释放
 
 解决方案:
 返回前使用 Block_copy
 使用后释放 Block_release
 网上错误答案:return [b copy];
  */

/*
 
 Product - Analyze (静态分析)
 从代码结构 上分析是否存在缺陷!本身并不会运行程序!并不能够检测到真正的内存泄漏!
 但是:只要是静态分析工具发现的问题,通常都是需要提升的代码!
 静态分析工具,是MRC开发时的利器!提前发现内存隐患!
 另外,在ARC开发时,如果程序要上架之前,建议使用静态分析工具检测一下,通常可以发现一些不注意的警告,有助于提升代码质量!尤其在使用到C语言框架的代码! I
 
 */

eBlock myBlock(){
    //局部变量存储在栈中
    int i = 10;
    eBlock b = ^{
        NSLog(@"hello sheen %d",i);
    };
    //利用Block_copy将block以及内部的变量拷贝到堆中
    return Block_copy(b);//返回使用前,进行copy
};



int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
        
        eBlock bb = myBlock();
        bb();
        Block_release(bb);//使用后要释放
        
    }
    return 0;
}


ARC与MRC在Xcode中的切换:


arc-->mrc

更多精彩文章请前往下图所示公众号进行交流沟通:


你想要的都在这里
上一篇下一篇

猜你喜欢

热点阅读