ARC中注意Block的泄漏问题

代码中block经常用到。例如网络请求?一些图形分析处理等,就是比较耗时的操作,多线程gcd然后进行操作。

这个时候,会使用block进行处理,然后调用相应的处理逻辑。

可能会对当前对象进行一些处理,现在分享的也就是这样的一种内存泄漏情况:

正常来说:释放内存都会调用dealloc函数,但是如果是下面的代码:

1 NSURLConnection sendAsynchronousRequest:xxReq queue:xxQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
2         self.xxData = data;
3 }
4 [self.navigationController popViewControllerAnimated:YES];

几个关键点:

1.block是强持有self的(strong)。

2.self对象不会释放了。因为退出了之后,block不会再进行销毁操作了。没有再dealloc了。这样的逻辑就是因为,有一些逻辑就是要强持有。就是有这样需求。

解决方法也非常简单:

__weak typedef(self) weakSelf = self;

self.xxData  ->  weakSelf.xxData;

参考网站:stackflow

时间: 2024-10-15 19:38:32

ARC中注意Block的泄漏问题的相关文章

block使用小结、在arc中使用block、如何防止循环引用

引言 使用block已经有一段时间了,感觉自己了解的还行,但是几天前看到CocoaChina上一个关于block的小测试主题 : [小测试]你真的知道blocks在Objective-C中是怎么工作的吗?,发现竟然做错了几道, 才知道自己想当然的理解是错误的,所以抽时间学习了下,并且通过一些测试代码进行测试,产生这篇博客. Block简介(copy一段) Block作为C语言的扩展,并不是高新技术,和其他语言的闭包或lambda表达式是一回事.需要注意的是由于Objective-C在iOS中不支

ARC中block块作为属性的使用笔记

ARC中block块作为属性的使用笔记 block较难理解,根据在内存中的分布情况就分为3种类型,根据使用的情形又分为很多很多种.虽然用起来容易,但使用不当会造成内存泄露,虽然都是这么说,但你真的研究过为什么会泄露吗?为什么有些时候外部变量进入block的时候会导致引用计数+1呢? 本人做过MRC以及ARC的开发,但大势所趋,ARC将是以后开发的主要模式,即使有MRC也是ARC混编MRC的代码,所以,本文的block的一些使用上的心得都基于ARC的,已经不考虑MRC的了,请看官注意,MRC与AR

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

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

ARC中__bridge, __bridge__transfer, __bridge_retained 关系

现在已经凌晨了,但是我却没发觉困. 琢磨了好久的东西,终于顿悟. 这篇是其中的一个点,记录下来,以备后续查阅! 说到__bridge,就不得不说Objective-C和Core Foundation对象之间的关系. 当你在 Objective-C 和 Core Foundation 对象之间进行转换时,就需要使用 Bridge cast. 今天的多数应用很少需要使用 Core Foundation,大多数工作都可以直接使 用 Objective-C 类来完成.但是某些底层 API,如 Core

IOS中的block 循环引用和retain cycle (经典)

retain cycle 的产生 说到retain cycle,首先要提一下Objective-C的内存管理机制. 作为C语言的超集,Objective-C延续了C语言中手动管理内存的方式,但是区别于C++的极其非人道的内存管理,Objective-C提出了一些机制来减少内存管理的难度. 比如:内存计数. 在Objective-C中,凡是继承自NSObject的类都提供了两种方法,retain和release.当我们调用一个对象的retain时,这个对象的内存计数加1,反之,当我们调用relea

iOS中为什么block用copy属性

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

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中使用Block

如何在iOS中使用Block Block可以帮助我们组织独立的代码段,并提高复用性和可读性.iOS4在UIKit中引入了该特征.超过100个的Apple API都使用了Block,所以这是一个我们必须开始熟悉的知识. Block是什么样的? 你可以使用^操作符来声明一个Block变量,它表示一个Block的开始. int num1 = 7; int(^aBlock)(int) = ^)int num2) { return num1+nunm2; }; 在如上代码中我们将Block声明为一个变量,

malloc中 heap block 的 blocksize 大小问题

heap block 引发的思考 问题背景: Implicit Free Lists Any practical allocator needs some data structure that allows it to distinguish block boundaries and to distinguish between allocated and free blocks. Most allocators embed this information in the blocks the