--------- block中常见的泄漏问题

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

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

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

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

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

几个关键点:

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

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

解决方法也非常简单:

__weak typedef(self) weakSelf = self;

self.xxData  ->  weakSelf.xxData;

###事实上,block中使用strong对象只是ARC内存管理中,常见的一种注意事项,还有NSTimer中SEL代码中,还有dispatch_afterxxx,delegate的weak属性等。
虽然是ARM “自动”管理内存,还是不能忽视常见的泄漏问题,使用常见的测试工具,都可以很快的找到问题所在,查阅资料,平时多看书,都是必不可少的。

--------- 手动释放资源问题

常见的几个场景,webView的释放泄漏问题,delegate释放问题,循环持有问题,notification的释放等。

问题分析:
1.delegate置空问题,避免指针的调用。

使用delegate的时候,maybe没有置空,导致消息还会继续传递,虽然,我们在传递的时候加上了一些判断:if(self.delegate == nil)...但是,实际上,ARC下,资源的手动释放,其实没有那么快的,也就是还没有来的及释放,导致delegate继续被持有,然后进一步导致资源的泄漏问题...如果没有做的话,在webView的泄漏中就会表现的尤为突出。还检测不到的。

2.循环持有问题

A对象保留持有B对象,B对象保留持有A对象。这种常见的锁的问题,其实在代码中也是非常常见的。可能一步小心就顺手写出来了。

解决方式:尝试各种姿势写代码吧,MVC?MMVC?Objection?或是响应式编程?都可以的。多看源码。

3.notification的释放问题

解决方式:置空。常见的还有一些c语言混编写的代码的资源释放问题。


参考资料:stackflow effective-oc  官网(https://developer.apple.com/library/ios/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html)

ARC注意的泄漏问题的更多相关文章

  1. arc下内存泄漏的解决小技巧

    一定要注意,我们运行app时,一定要关心内存的使用,尽量不要超过20M,即使有很多图片要显示也绝对不能超过30M.所以运行自己开发的app时多关心内存的使用是个很好的习惯. 对于性能,内存的优化,这个 ...

  2. iOS通过ARC管理内存(内容根据iOS编程编写)

    栈 当程序执行某个方法(或函数)时,会从内存中一个叫栈的区域分配一块内存空间,这块内存空间我们叫帧.帧负责保护程序在方法内声明的变量的值.在方法内声明的变量我们称之为局部变量. 当我们的程序开始启动, ...

  3. 《ARC以及非ARC的讨论》

    ARC的机制是什么?它在那里放入retain/release函数调用? 请停止思考这些问题,把更多的精力放在下面的问题上,比如你的程序逻辑,对象的强,弱引用,对象的所属关系,可能的循环引用等问题上. ...

  4. Objective C中的ARC的修饰符的使用---- 学习笔记九

    #import <Foundation/Foundation.h> @interface Test : NSObject /** * 默认的就是__strong,这里只是做示范,实际使用时 ...

  5. 2016 - 2 - 19 ARC内存管理知识总结(一,arc基本概念及alloc等方法的实现)

    一. ARC的基本概念 1. 在objc中采用automatic reference counting 机制, 让编译器来进行内存管理.在降低程序崩溃,内存管理泄漏等风险的同时,很大程度减少了程序员的 ...

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

    引言 使用block已经有一段时间了,感觉自己了解的还行,但是几天前看到CocoaChina上一个关于block的小测试主题: [小测试]你真的知道blocks在Objective-C中是怎么工作的吗 ...

  7. 【Swift学习】Swift编程之旅---ARC(二十)

    Swift使用自动引用计数(ARC)来跟踪并管理应用使用的内存.大部分情况下,这意味着在Swift语言中,内存管理"仍然工作",不需要自己去考虑内存管理的事情.当实例不再被使用时, ...

  8. iOS ARC内存管理

    iOS的内存管理机制,只要是iOS开发者,不管多长的时间经验,都能说出来一点,但是要深入的理解.还是不简单的.随着ARC(自动管理内存)的流行.iOS开发者告别了手动管理内存的复杂工作.但是自动管理内 ...

  9. iOS学习笔记之ARC内存管理

    iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其 ...

随机推荐

  1. Flynn初步:基于Docker的PaaS台

    Flynn它是一个开源PaaS台,无论要部署的应用程序,你可以建立自己的主动性Docker容器集群的实现,能特性与组件设计大量參考了传统的PaaS平台Heroku.本文旨在从使用动机.基本对象.层次架 ...

  2. WebStorm的compass配置

    在webstorm中配置compass WebStorm是功能强大的前端开发专用IDE,拥有即时编辑(chrome).自动完成.debugger.Emmet.HTML5 支持.JSLint.Less. ...

  3. js cookie设置最大过期时间 Infinity

    Note: 对于永久cookie我们用了Fri, 31 Dec 9999 23:59:59 GMT作为过期日.如果你不想使用这个日期,可使用世界末日Tue, 19 Jan 2038 03:14:07 ...

  4. Spring : 征服数据库 (两)

    本节介绍Spring和ORM集成框架.尽管Hibernate在开源ORM 社区很受欢迎.但是,本文将MyBatis案例解说.也MyBatis和Hibernate好坏是没有意义的,主要看实际需求,有兴趣 ...

  5. Visual Studio Team Services使用教程--邀请团队成员

  6. hdu3480二维斜率优化DP

    Division Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 999999/400000 K (Java/Others) Tota ...

  7. CodeForces 398B 概率DP 记忆化搜索

    题目:http://codeforces.com/contest/398/problem/B 有点似曾相识的感觉,记忆中上次那个跟这个相似的 我是用了 暴力搜索过掉的,今天这个肯定不行了,dp方程想了 ...

  8. DFT 展开式和 FFT推导

    C语言的FFT //---------------------------------------------------------------------------------- //----- ...

  9. BZOJ 1015 JSOI2008 星球大战 starwar 并检查集合

    标题效果:给定一个无向图.联通谋求块的数目,以及k一个点的破坏后每次:联通,块的数目 侧面和摧毁的地步全记录,我们可以做相反的. 需要注意的是该点不能算作破坏联通块 #include<cstdi ...

  10. SQL Server的还原

    原文:SQL Server的还原 1.差异备份的还原 不备份结尾日志的情况下还原数据 创建差异备份的放在我们已经在前面一篇博客SQL Server的备份中提到了,这里我们不再赘述,下面我们给出差异备份 ...