前言:最近因为block多次出现问题,就决定好好的研究一下block的原理。自己获得一些东西,分享一下,不足之处,请多多指教!
一、堆区、栈区 的区别
关于堆和栈的具体定义网上各路大神说的比较相近,这里提区别是为了后面关键字的区别做铺垫
栈:
1、 需要手动释放,不及时回收会造成内存泄漏。iOS为了解决这个问题,才有了自动释放池的功能,自动释放池其本质是代替程序员去做释放。
2、 栈的分配方式分为静态分配和动态分配,静态分配是由系统完成的,例如局部变量的分配;动态分配是由alloc函数进行分配,需要注意一点,栈的动态分配也是由系统自动释放的,这和堆的动态分配回收是不同的。
堆:
1、手动释放,不及时释放,会造成内存泄漏。
2、堆是动态分配和回收内存,没有静态分配的堆。
二、关键字对blcck的影响
1、无外部变量
可以看到 ,在没有外部变量的情况下,三种关键字修饰后,都存在全局区。
2、有外部变量
2.1 静态变量(全局和部分),全局变量也是放在全局区,如上图一样。
2.2 ,其他外部变量 copy、strong修饰的block在堆区mallocBlock,weak修饰的block在栈区stackBlock,此时weak修饰的会奔溃,被提前释放了。
weak存于栈区是根据奔溃反向推断的,还没有能验证,等验证后,补上验证结果。
三 、结论
1.没有外部变量的情况下,block属于全局区
2 有外部变量的情况下
2.1 无论全局变量、全局静态变量、局部静态变量,block依然在全局区
2.2 普通外部变量 ,copy、strong修饰的block在堆区mallocBlock,weak修饰的block在栈区
本质:有普通外部变量的block,它创建后就是在栈区,只是copy、strong修饰的block会把它从栈区移动到堆区,而weak不会。
四、感谢
感谢简书上的大神提供的思路。