一、栈区和堆区概念
栈区:由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.
堆区:一般由程序员分配释放,若程序员不释放,程序结束时可能有 OS 回收,注意它与数据结构中的堆是两回事,分配方式是类似于链表.
二、block 用 copy 作用域
首先,block 是一个对象,所以 block 理论上是可以 retain/release 的,但是 block 在创建的时候它的内存是默认分配在栈(stack)上,而不是堆(heap)上的,所以它的作用域仅限创建时候的上下文(函数,方法···),当你在该作用域外调用该 block 时,程序就会奔溃.
注意:
一般情况下你不需要自行调用 copy 或者 retain 一个 block,只有当你需要在 block 定义域以外的地方使用时才需要 copy,copy 将 block 从内存栈区移到堆区。
其实,block 使用 copy 是 MRC 留下来的算是一个传统吧,在 MRC 下,如上所述,在方法中的 block 创建在栈区,使用 copy 就能把它放到堆区,这样在作用域外调用该 block 程序就不会奔溃.
但是,在 ARC 下,使用 copy 与 strong 其实都是一样的,因为 block 的 retain 就是用 copy 来实现的,所以 block 使用 copy 还能装装逼,说明自己是从 MRC 下走过来的.
最要用 copy 修饰
1条评论