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
更多精彩文章请前往下图所示公众号进行交流沟通:
你想要的都在这里