初始情况下:

block本身、__block修饰的变量以及在block内部使用的变量都是在栈里的。

__block修饰的变量的地址会作为实参传入block块内部(暂时先这么理解,实际比较复杂)。block使用的外部变量被const拷贝到了block内部。也就是block使用的外部变量和这个外部变量本身没有关系。

copy方法之后

被拷贝的方法还是在栈上。但是拷贝之后的block已经被放在了heap(堆)上。同时__block修饰的变量被移动到了堆上,原来在栈上的已经不存在。还有block的外部变量的const拷贝也被拷贝到了堆上。

如果block块使用的外部变量是一个refernce的对象,那么这个对象的引用计数会增加1。

堆上的block再做一次copy之后,只是引用计数增加1,但是不会重新再做拷贝动作。

retain操作

由于retain是有返回值的。retain要求返回的地址和调用对象的地址一致。但是block的地址可能是会变的(尤其是从栈到堆的过程),所以对block做retain操作是没有用处的。什么都不会做!

销毁(或内存回收时)

heap上的block块先于stack上的被销毁时,如调用release销毁堆上的block块。heap中的block块在引用计数变为0的时候被销毁。而__block修饰的变量还在heap中,因为stack还要使用,同时栈上的block快也要使用。

当heap上的block块晚于stack时,stack会被清除。在heap中的block块在调用release减少引用计数到0的时候释放内存。

block和Objective-C对象

如果对block做拷贝操作,block会对其内部使用的对象生成强引用。

如果在block块内部使用了:

  1. 以引用的方式使用了类的成员变量,那么这个block会对self产生强引用。
  2. 以值得方式使用了类的成员变量,那么这个block会对这个变量本身产生强引用。

例如:

dispatch_async(queue, ^{// instanceVariable is used by reference, a strong reference is made to self
    doSomethingWithObject(instanceVariable);
});id localVariable = instanceVariable;
dispatch_async(queue, ^{/*localVariable is used by value, a strong reference is made to localVariable(and not to self).*/doSomethingWithObject(localVariable);
});

以上可以通过__block修饰符来改变。是的__block是另外的一种存储类型,就像copy、retain什么的。这样这个引用就直接被传递到了block中。

但是__block是不可以用来消除对self的循环引用的。

欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 330987132 | Go:217696290 | Python:336880185 | 做人要厚道,转载请注明出处!http://www.cnblogs.com/sunshine-anycall/p/4780356.html

iOS的block内存管理相关推荐

  1. iOS/OS X内存管理(二):借助工具解决内存问题

    上一篇博客<iOS/OS X内存管理(一):基本概念与原理>主要讲了iOS/OS X内存管理中引用计数和内存管理规则,以及引入ARC新的内存管理机制之后如何选择ownership qual ...

  2. iOS/OS X内存管理(一):基本概念与原理

    iOS/OS X内存管理(一):基本概念与原理 发表于21小时前| 1585次阅读| 来源CSDN| 8 条评论| 作者刘耀柱 移动开发iOSObjective-C内存管理内存泄露局部变量开发经验 a ...

  3. iOS开发ARC内存管理技术要点

    本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节.这篇 ...

  4. iOS开发ARC内存管理

    本文的主要内容: ARC的本质 ARC的开启与关闭 ARC的修饰符 ARC与Block ARC与Toll-Free Bridging ARC的本质 ARC是编译器(时)特性,而不是运行时特性,更不是垃 ...

  5. iOS夯实:内存管理

    最近的学习计划是将iOS的机制原理好好重新打磨学习一下,总结和加入自己的思考. 有不正确的地方,多多指正. 基本信息 Objective-C 提供了两种内存管理方式. MRR (manual reta ...

  6. iOS开发经验总结—内存管理

    From: http://ihuby.info/2011/07/18/ios%E5%BC%80%E5%8F%91%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93-%E5%86% ...

  7. iOS OC08,09_内存管理

    //管理内存有三种方式,//1.是垃圾回收,java常见的管理内存的方法,系统来检測对象是否被使用,是否被释放//2.MRC手动管理引用计数,iOS管理内存的方式,程序猿通过手动的方式来管理对象是否被 ...

  8. (0048)iOS开发之内存管理探究

    注意网上很多人支招在ARC模式下可以利用_objc_rootRetainCount()或者CFGetRetainCount()取得 retainCount都是不准确的,特别是在对象拷贝操作之后你会发现 ...

  9. iOS之Block总结以及内存管理

    block定义 struct Block_descriptor {unsigned long int reserved;unsigned long int size;void (*copy)(void ...

最新文章

  1. mysql利用存储过程批量插入数据
  2. python雷达图-Python成绩单雷达图
  3. oracle中rownum和row_number()
  4. php获取特殊标签,thinkphp特殊标签使用
  5. 出国怎么能不出现天价微博?
  6. 学习ROS过程中遇到的一些小问题以及解决办法的记录
  7. Ubuntu 16.04 安装Go 1.9.2
  8. Bootstrap3 排版-地址
  9. Linux 中 crontab 详解及示例(收藏)
  10. jxl导入Excel
  11. **inline**与**volatile**关键字
  12. Typora下载加速
  13. 多余的回车键(Enter)
  14. WPF支持OneWay,TwoWay,OneTime,Default和OneWayToSource
  15. 电邮里面是图片怎么下载_这是最有效的采访后谢谢您的电子邮件
  16. 7个你不可不知的大数据定义
  17. pytohn用Pillow或OpenCV删除图片某种颜色
  18. 人工智能学习前的简单了解
  19. 蓝牙模块基础知识介绍
  20. Android Studio debug 时 app 会崩溃

热门文章

  1. 【rnnoise源码分析】rnn_train中的训练模型
  2. 面试必备的C++知识(未完待续)
  3. CLion报错解决:allocating an object of abstract class type--unimplemented pure virtual method
  4. 7-6 统计字符串中数字字符的个数_洛谷 || 标题统计(C语言)
  5. mysql数据库blob区别_MySQL中TEXT与BLOB字段类型的区别
  6. Nginx 真实的 IP
  7. java项目怎样提高性能_从代码的角度谈如何优化JAVA代码以提高性能【初、中级程序员必看】...
  8. iOS开发笔记--UIView中的坐标转换
  9. NSInvocation
  10. 在同一个文件中定义多个命名空间