copy 、strong、weak 对于block的影响

前言:最近因为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不会。

四、感谢

 感谢上的大神提供的思路。

你可能感兴趣的:(copy 、strong、weak 对于block的影响)