ARC下block使用情况
ARC与MRC的block有着一些区别,笔记整理ARC的block,仅仅是自己参考的笔记,详情请参考 http://www.cnbluebox.com/?p=255
在开始之前,请新建一个Model类,写几个如下的属性,用于后面测试block的特性.


Block的类型与内存管理
根据Block在内存中的位置分为三种类型NSGlobalBlock,NSStackBlock, NSMallocBlock。
- NSGlobalBlock:类似函数,位于text段;
- NSStackBlock:位于栈内存,函数返回后Block将无效;
- NSMallocBlock:位于堆内存。

从打印信息处可以看出,该block是一个__NSGlobalBlock__.

虽然只是简单的改了一下,但很明显,刚刚的__NSGlobalBlock__已经变成了__NSMallocBlock__,此处我们可以得知,在处理对象时,block会malloc的.
我们使用弱引用集合NSHashTable来验证,一个block的强引用的情况.
#import <Foundation/Foundation.h> @interface YX_NSHashTable : NSObject + (void)add:(id)obj;
+ (BOOL)contain:(id)obj;
+ (NSArray *)allObjs; @end
#import "YX_NSHashTable.h" static NSHashTable *table = nil; @implementation YX_NSHashTable + (void)initialize
{
if (self == [YX_NSHashTable class])
{
table = [NSHashTable weakObjectsHashTable];
}
} + (void)add:(id)obj
{
[table addObject:obj];
} + (BOOL)contain:(id)obj
{
return [table containsObject:obj];
} + (NSArray *)allObjs
{
return [table allObjects];
} @end

从打印信息还看不出什么东西出来-_-!!

将block设置成copy属性后,很明显,还没运行就已经提示了循环引用的问题.
控制器强引用了一个block,而该malloc的block也强引用了控制器.所以,导致了循环引用的问题.
堆内存的一个明显的特性就是:他会强引用block中的对象,如果该block被其他不会被释放的东西给强引用了,就会导致循环引用.
问:ARC支持dispatch_queue吗?
http://stackoverflow.com/questions/8618632/does-arc-support-dispatch-queues/8619055#8619055
If your deployment target is lower than iOS 6.0 or Mac OS X 10.8
You need to use dispatch_retain and dispatch_release on your queue. ARC does not manage them.
If your deployment target is iOS 6.0 or Mac OS X 10.8 or later
ARC will manage your queue for you. You do not need to (and cannot) use dispatch_retain or dispatch_release if ARC is enabled.
结论:如果你的iOS编译的target是iOS6.0+,ARC支持dispatch_queue.
问:如何才能在block中不至于造成泄露呢?
即使是NSMallocBlock也不一定会泄露,但是如果是一个copy属性的block,它一定是NSMallocBlock,这个就需要十分注意.出现在这个block中的对象,是会被这个包含这个block的对象给强引用的.如果这个对象是个单例而不会被释放掉,那就泄露了.
问:这种block会导致_model对象泄露吗?

因为block里面出现了对象,这个block变成了NSMallocBlock,理论上,_model会在该block的生命周期中一直被持有.直到它被销毁.
问:方法中的block是怎么回事呢?

方法中的block是栈block,不用担心会被强引用.
问:MRC中的__block与ARC中的__weak有啥联系?
The __block keyword marks variables that can be modified inside the block (we're not doing that) but also they are not automatically retained when the block is retained (unless you are using ARC). If you do this, you must be sure that nothing else is going to try to execute the block after the MyDataProcessor instance is released. (Given the structure of your code, that shouldn't be a problem.) Read more about __block.
If you are using ARC, the semantics of __block changes and the reference will be retained, in which case you should declare it __weak instead.
在MRC中, __block 可以让一个变量在 block 中进行修改而不会被这个 block retain.
在ARC中, __weak 才能让一个变量在 block 中不被这个block强引用.
__block是在MRC中使用的.
__weak是在ARC中使用的.
ARC下block使用情况的更多相关文章
- iOS: ARC和非ARC下使用Block属性的问题
1. Block的声明和线程安全 Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非AR ...
- ARC下的block导致的循环引用问题解析
ARC下的block导致的循环引用问题解析 更详细细节请参考 http://blog.sina.com.cn/s/blog_8c87ba3b0101m599.html ARC下,copy到堆上的blo ...
- Block 在 ARC 下的拷贝
前言 现在有一种说法,是开启arc选项时,已经没有栈上的block了,所以所有的block都不需要copy来拷贝到堆上了.那么这个说法正确与否呢? 结论是这个说法必须是错误的,首先的一点就是arc只是 ...
- IOS开发 ARC和非ARC下使用Block属性的问题
1. Block的声明和线程安全 Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非AR ...
- 八.OC基础加强--1.autorelease的用法 2.ARC下内存管理 3.分类(category)4.block的学习
1.autorelease的用法 1.自动释放池及autorelease介绍 (1)在iOS程序运行过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的. (2)当一个对象调用auto ...
- 如何解决结果由block返回情况下的同步问题(转)
开发中经常会遇到一种简单的同步问题: 系统在获取资源时,采用了block写法,外部逻辑需要的结果是在block回调中返回的 举个例子: 请求获取通讯录权限的系统弹窗 调用系统方法请求通讯录权限: AB ...
- block 在ARC和非ARC下的不同含义
Block的循环引用 对于非ARC下, 为了防止循环引用, 我们使用__block来修饰在Block中使用的对象: 对于ARC下, 为了防止循环引用, 我们使用__weak来修饰在Block中使用的对 ...
- xcode arc 下使用 block警告 Capturing [an object] strongly in this block is likely to lead to a retain cycle” in ARC-enabled code
xcode arc 下使用 block警告 Capturing [an object] strongly in this block is likely to lead to a retain cyc ...
- iOS开发——OC基础-ARC、BLOCK、协议
一.ARC ARC 是一种编译器特性!而不是IOS运行时特性,和JAVA中得垃圾回收机制完全不一样ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的 ...
随机推荐
- Maven 学习笔记(三)
Maven生命周期 在上次我们使用maven package 对项目进行打包.这里就是为其指定一个生命周期.生命周期是包含在一个项目构建中的一系列有序的阶段.Maven有许多不同的生命周期,比如验证( ...
- 一次tomcat数据乱码事件
一次环境变量出错导致的tomcat数据乱码事件 1.1 事件起因 由于业务的调整,我们需要将在A服务器上的后台系统迁移到B服务器上的后台,我们选择在下班后进行迁移,因为那个时间点,后台系统已经几乎没有 ...
- 在Linux系统安装Nodejs最简单步骤
一.去官网下载和自己系统匹配的文件 英文网址:https://nodejs.org/en/download/ 中文网址:http://nodejs.cn/download/ 通过 uname -a ...
- 从入门到不放弃系列之Koa2
一.Koa2入门 本来是想Express入门的,但是既然都是要学,干嘛不学最新的呢? 其实我想说,我本来只是想学个小程序开发,现在已经陆陆续续开了好多坑了.. 本文参考廖雪峰教程 二.Async 最新 ...
- 【Xmail】使用Xmail搭建局域网邮件服务器
下载地址: http://www.xmailserver.org/xmail-1.27.win32bin.zip,当前最新版本 1.27. 解压文件:xmail-1.27.win32bin.zip ...
- springcloud-feign的hystrix支持
关于hystrix的介绍,可以看我的上篇博客:springcloud-断路器hystrixs 本文主要介绍在feign中,如何使用hystrix 1.pom依赖 <dependency> ...
- spring下redis使用资料
参考资料地址: spring集成redis Spring缓存注解@Cacheable.@CacheEvict.@CachePut使用 redis常用命令 redis持久化(RDB与AOF) Redis ...
- js如何判断IE浏览器的版本包括IE11
IE浏览器真是个坑:从ie6以及以前IE版本,简直就是垃圾,不按照Mozilla国际组织的标准来,乱搞.搞得兼容性很差: <script type="text/javascript ...
- Android Studio 1.1.0汉化初步出炉!
我找到去年12月国人汉化的版本,然后迁移上来的.实测支持Android window最新版(1.1.0) 项目分4部分:1压缩好的:2文本分析器:3原生的语言包:4原版语言包备份 现在一些新增的项目没 ...
- win10 系统下MyEclipse用SVN之后想切换用户的解决方法
1.在svn 创建了两类账户,分别是管理员 和 开发人员. 2.代码同步到Myecclipse .使用的是 admin 管理员账户checkout. 3.提交代码的时候想用开发者账户user提交,发现 ...