iOS block为什么要用copy
程序员文章站
2022-11-05 12:27:18
ios block为什么要用copy。
一、栈区和堆区概念
内存的栈区 : 由编译器自动分配释放, 存放函数的参数值, 局部变量的值等. 其操作方式类似于数据结构中的栈.
内存的堆区 : 一般由程序...
ios block为什么要用copy。
一、栈区和堆区概念
内存的栈区 : 由编译器自动分配释放, 存放函数的参数值, 局部变量的值等. 其操作方式类似于数据结构中的栈.
内存的堆区 : 一般由程序员分配释放, 若程序员不释放, 程序结束时可能由os回收. 注意它与数据结构中的堆是两回事, 分配方式倒是类似于链表.
二、block用copy作用域
首先, block是一个对象, 所以block理论上是可以retain/release的. 但是block在创建的时候它的内存是默认是分配在栈(stack)上, 而不是堆(heap)上的. 所以它的作用域仅限创建时候的当前上下文(函数, 方法...), 当你在该作用域外调用该block时, 程序就会崩溃.
官方文档:
注意:
1.一般情况下你不需要自行调用copy或者retain一个block. 只有当你需要在block定义域以外的地方使用时才需要copy. copy将block从内存栈区移到堆区.
2.其实block使用copy是mrc留下来的也算是一个传统吧, 在mrc下, 如上述, 在方法中的block创建在栈区, 使用copy就能把他放到堆区, 这样在作用域外调用该block程序就不会崩溃.
3.但在arc下, 使用copy与strong其实都一样, 因为block的retain就是用copy来实现的, 所以block使用copy还能装装逼, 说明自己是从mrc下走过来的。
推荐阅读
-
iOS 开发 NSString(NSDictory,NSArray)为什么用copy修饰,而不是用strong修饰
-
iOS @property中的NSString, NSArray, NSDictionary属性为什么大多时候用copy而不用strong的原因
-
iOS block为什么要用copy
-
iOS 属性知识之为什么要使用copy特性
-
iOS 开发 NSString(NSDictory,NSArray)为什么用copy修饰,而不是用strong修饰
-
iOS中代理属性为什么要用Weak修饰?
-
iOS @property中的NSString, NSArray, NSDictionary属性为什么大多时候用copy而不用strong的原因
-
iOS block为什么要用copy
-
iOS 属性知识之为什么要使用copy特性