美文网首页简书三体组织
Blcok相关经典面试题

Blcok相关经典面试题

作者: a295ff153449 | 来源:发表于2020-03-11 10:46 被阅读0次

    题目:事例分析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

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


    你想要的都在这里

    相关文章

      网友评论

        本文标题:Blcok相关经典面试题

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