iOS知识点2

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)