iOS中Block内存管理分为三种:
- NSGloabBlock
- NSStackBlock
- NSMallocBlock
1: MRC中使用的__
block可以表示若引用,ARC中要使用__
weak修饰表示弱引用.
- NSGloabBlock:retain,copy,release 不会正价引用计数
- NSStackBlock:retain.release ,copy不会改变引用计数,copy可以
- NSMallocBlock:位于堆区,retain,release.引用计数改变.
注意:防止block循环引用,正确使用weak 和__
block的修饰
验证总结如下:
- 作用域内定义的block 没有引用外部变量的在全局区 引用了外部变量 在堆区
- block作为参数 如果引用了外部变量 是在栈区,未引用还在全局区
- 全局区的block 不会被拷贝到堆区,无论是外部指针引用 还是copy 操作 都没有任何改变
-
只有栈区的block 如果被外部指针引用 或者copy 才会被拷贝到堆区