您的位置:首页 > 移动开发 > IOS开发

iOS知识点2

2018-02-24 16:05 148 查看
1.block的实质是什么?一共有几种block?都是什么情况下生成的?
block:本质就是一个object-c对象.
block:存储位置,可能分为3个地方:代码区,堆区、栈区(ARC情况下会自动拷贝到堆区,因此ARC下只能有两个地方:代码区、堆区)
代码区:不访问栈区的变量(如局部变量),且不访问堆区的变量(alloc创建的对象),此时block存放在代码区。
堆区:访问了处于栈区的变量,或者堆区的变量,此时block存放在堆区。–需要注意实际是放在栈区,在ARC情况下会自动拷贝到堆区,如果不是ARC则存放在栈区,所在函数执行完毕就回释放,想再外面调用需要用copy指向它,这样就拷贝到了堆区,strong属性不会拷贝、会造成野指针错区。
2.为什么在默认情况下无法修改被block捕获的变量? __block都做了什么?
默认情况下,block里面的变量,拷贝进去的是变量的值,而不是指向变量的内存的指针。
使用__block修饰后的变量,拷贝到block里面的就是指向变量的指针,所以我们就可以修改变量的值。
3.造成内存泄漏的可能的原因?
第三方框架不正当使用。
block,delegate,NSTimer循环使用。
非oc对象的内存处理。
地图类处理。
大次数循环内存暴涨。

非oc对象的释放:
例如使用CGImageRelease(ref)方法释放内存;
CoreFoundation框架下的某些对象或者变量需要手动释放,c语言中malloc需要free;
地图类内存释放:
在使用完毕之后注意将地图及其相关代理释放,地图中大头针需正确复用,并使用完成之后清空标注;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS知识点 面试