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有啥联系?

http://stackoverflow.com/questions/7853915/how-do-i-avoid-capturing-self-in-blocks-when-implementing-an-api

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使用情况的更多相关文章

  1. iOS: ARC和非ARC下使用Block属性的问题

    1. Block的声明和线程安全 Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非AR ...

  2. ARC下的block导致的循环引用问题解析

    ARC下的block导致的循环引用问题解析 更详细细节请参考 http://blog.sina.com.cn/s/blog_8c87ba3b0101m599.html ARC下,copy到堆上的blo ...

  3. Block 在 ARC 下的拷贝

    前言 现在有一种说法,是开启arc选项时,已经没有栈上的block了,所以所有的block都不需要copy来拷贝到堆上了.那么这个说法正确与否呢? 结论是这个说法必须是错误的,首先的一点就是arc只是 ...

  4. IOS开发 ARC和非ARC下使用Block属性的问题

    1. Block的声明和线程安全 Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非AR ...

  5. 八.OC基础加强--1.autorelease的用法 2.ARC下内存管理 3.分类(category)4.block的学习

    1.autorelease的用法   1.自动释放池及autorelease介绍 (1)在iOS程序运行过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的. (2)当一个对象调用auto ...

  6. 如何解决结果由block返回情况下的同步问题(转)

    开发中经常会遇到一种简单的同步问题: 系统在获取资源时,采用了block写法,外部逻辑需要的结果是在block回调中返回的 举个例子: 请求获取通讯录权限的系统弹窗 调用系统方法请求通讯录权限: AB ...

  7. block 在ARC和非ARC下的不同含义

    Block的循环引用 对于非ARC下, 为了防止循环引用, 我们使用__block来修饰在Block中使用的对象: 对于ARC下, 为了防止循环引用, 我们使用__weak来修饰在Block中使用的对 ...

  8. 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 ...

  9. iOS开发——OC基础-ARC、BLOCK、协议

    一.ARC ARC 是一种编译器特性!而不是IOS运行时特性,和JAVA中得垃圾回收机制完全不一样ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的 ...

随机推荐

  1. springboot-3-其他配置

    1, 热部署: 有jrebel的话, 不用了, 不如jre好用 原理: 使用两个classLoad, 一个加载不改变的jar, 另一个加载可更改的jar, 发生改变后, 舍弃可更改的jar重新rest ...

  2. 在Struts2标签s:textfield中显示正确的日期

    Java代码   struts2中的日期期输入显示问题   struts2 中的默认的日期输出并不符合我们的中文日常习惯.以下是我知道的在struts2中进行日期格式化输出的几种方式. 1.利用 &l ...

  3. goldarch企业管理软件框架整体解决方案终于出来了

    所有的图片及解决方案都在我的博客里http://blog.posn.net 框架把企业管理软件开发中要遇到的常用做了组件化处理,达到了通用性和可定制性的目的. goldarch的数据层是spring. ...

  4. java面试①整体流程

    http://www.toutiao.com/i6463396763549041166/ 1.1 简单的自我介绍 我是xxx工作了xx年,在xx公司,做过xx项目, 1.2你简单介绍一下xxx项目 为 ...

  5. 如何在生产环境禁用swagger

    pringMVC集成springfox-swagger2和springfox-swagger-ui很简单,只需要两步: (1)pom中添加依赖 <dependency> <group ...

  6. Day1:了解APICloud平台、理解APICloud应用设计思想、掌握平台使用流程。学习如何对一款APP进行需求分析、功能分解和架构设计等编码之前重要的准备工作

    学习目标 总体上了解一下APICloud平台,重点介绍相关的学习资源,入门资料,常见的FAQ等 明确我们这七天要开发一个什么样的APP,明确功能需求,跟上每天的课程节奏,可以课前预习 梳理出对于一款A ...

  7. jQuery通过input标签的name获取值

    jquery根据name属性查找 $("div[id]") 选择所有含有id属性的div元素 $("input[name='keleyicom']") 选择所有 ...

  8. 1Java开发环境

    1 下载      1.1 oracle官方网站 http://www.oracle.com/index.html      1.2 点击DOWNLOADS http://www.oracle.com ...

  9. Linux CPU使用率的计算

         CPU 使用率衡量的是程序运行占用的CPU 百分比.Linux 的CPU 使用率信息可以通过/proc/stat 文件计算得到. proc 文件系统       /proc 文件系统是一个伪 ...

  10. JAVA非静态成员变量之死循环

    1.非静态成员变量 当成员变量为非静态成员变量且对当前类进行实例化时,将会产生死循环 例子: public class ConstructorCls { private ConstructorCls ...