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,不用担心会被强引用.

ARC下block使用情况,码迷,mamicode.com

时间: 2024-08-03 12:53:47

ARC下block使用情况的相关文章

[转]iOS中ARC下Block的循环引用

[ARC的特性] ARC下,所有NSObject类型指针, 1. 默认为__strong类型 2. 可以显示的指定为__weak类型,__weak类型指针在所指向对象销毁后会自动置为nil 3. __autorelesing类型用于inout参数类型 ARC下,当一个函数返回一个NSObject指针时,编译器会帮我们实现autorelease调用.例如: return pObject; 编译器会帮我们扩展为 return [pObject autorelease]; ARC下,不能显式relea

__block在MRC ARC下的区别

研究下__block在MRC/ARC下区别,直接上代码. @property (nonatomic,copy) TestBlock   block;//定义的block 一._NSConcreteStackBlock - (void)stackBlock{ NSLog(@"stackBlock start...."); Person *person = [[Person alloc]init];person.personName = @"张三"; NSLog(@&q

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

1.autorelease的用法   1.自动释放池及autorelease介绍 (1)在iOS程序运行过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的. (2)当一个对象调用autorelease时,会将这个对象放到位于栈顶的释放池中 . 2.为什么会有autorelease? OC的内存管理机制中比较重要的一条规律是:谁申请,谁释放. 但有些情况下,开发者并不能确定某些对象何时释放.这时候就需要自动释放池. 它的好处是: (1)不需要再关心对象释放的时间 : (2)不需要再关

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

1. Block的声明和线程安全 Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非ARC下返回Block). 另一个需要注意的问题是关于线程安全,在声明Block属性时需要确认“在调用Block时另一个线程有没有可能去修改Block?”这个问题,如果确定不会有这种情况发生的话,那么Block属性声明可以用nonatomic.如果不肯定的话(通常情况是这样的),那么你首先需要声明Blo

ARC下面的Block对内存的管理方式

一.问题引入 近日开发中引入一个随机crash,Crash堆栈如下: Exception Type: SIGSEGV Exception Codes: SEGV_ACCERR at 0x0000000101850148 Crashed Thread: 0 Thread 0 Crashed: 0 libobjc.A.dylib 0x00000001802601a0 objc_retain + 16 1 CoreFoundation 0x0000000180f593a0 -[__NSDictiona

IOS开发——OC基础-ARC、BLOCK、协议

一.ARC ARC 是一种编译器特性!而不是IOS运行时特性,和JAVA中得垃圾回收机制完全不一样ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain.release.autorelease语句.你不再需要担心内存管理,因为编译器为你处理了一切ARC规则:只要还有一个强指针变量指向对象,对象就会保持在内存中弱指针指向的对象被回收后,弱指针会自动变为nil指针,不会引发野指针错误使用注意:1.不允许调用release.retain.re

ARC下需要注意的内存问题

之前发了一篇关于图片加载优化的文章,还是引起很多人关注的,不过也有好多人反馈看不太懂,这次谈谈iOS中ARC的一些使用注意事项,相信做iOS开发的不会对ARC陌生啦.这里不是谈ARC的使用,只是介绍下ARC下仍然可能发生的内存泄露问题,可能不全,欢迎大家补充. Ps:关于ARC的使用以及内存管理问题,强烈建议看看官方文档,里面对内存管理的原理有很详细的介绍,相信用过MRC的一定看过这个. 另也有简单实用的ARC使用教程:ARC Best Practices 在2011年的WWDC中,苹果提到90

理解 ARC 下的循环引用

本文由 伯乐在线 - nathanw 翻译,dopcn 校稿.未经许可,禁止转载!英文出处:digitalleaves.com.欢迎加入翻译组. ARC 下的循环引用类似于日本的 B 级恐怖片.当你刚成为苹果开发者,你或许不会关心他们的存在.直到某天你的一个 app 因内存泄露而闪退,你才突然意识到他们的存在,并且发现循环引用像幽灵一样存在于代码的各个角落.年复一年,你开始学会如何处理循环引用,检测和避免它们,但是这部片子的恐怖结局还是在那里,随时可能出现. ARC 令许多开发者(包括我)感到失

ARC下需要注意的内存管理

ARC下需要注意的内存管理 2016/04/03 · iOS开发 · 内存管理 分享到:1 原文出处: 一不(@luoyibu) 之前发了一篇关于图片加载优化的文章,还是引起很多人关注的,不过也有好多人反馈看不太懂,这次谈谈iOS中ARC的一些使用注意事项,相信做iOS开发的不会对ARC陌生啦.这里不是谈ARC的使用,只是介绍下ARC下仍然可能发生的内存泄露问题,可能不全,欢迎大家补充. Ps:关于ARC的使用以及内存管理问题,强烈建议看看官方文档,里面对内存管理的原理有很详细的介绍,相信用过M