ARC注意的泄漏问题
--------- 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注意的泄漏问题的更多相关文章
- arc下内存泄漏的解决小技巧
		
一定要注意,我们运行app时,一定要关心内存的使用,尽量不要超过20M,即使有很多图片要显示也绝对不能超过30M.所以运行自己开发的app时多关心内存的使用是个很好的习惯. 对于性能,内存的优化,这个 ...
 - iOS通过ARC管理内存(内容根据iOS编程编写)
		
栈 当程序执行某个方法(或函数)时,会从内存中一个叫栈的区域分配一块内存空间,这块内存空间我们叫帧.帧负责保护程序在方法内声明的变量的值.在方法内声明的变量我们称之为局部变量. 当我们的程序开始启动, ...
 - 《ARC以及非ARC的讨论》
		
ARC的机制是什么?它在那里放入retain/release函数调用? 请停止思考这些问题,把更多的精力放在下面的问题上,比如你的程序逻辑,对象的强,弱引用,对象的所属关系,可能的循环引用等问题上. ...
 - Objective C中的ARC的修饰符的使用---- 学习笔记九
		
#import <Foundation/Foundation.h> @interface Test : NSObject /** * 默认的就是__strong,这里只是做示范,实际使用时 ...
 - 2016 - 2 - 19 ARC内存管理知识总结(一,arc基本概念及alloc等方法的实现)
		
一. ARC的基本概念 1. 在objc中采用automatic reference counting 机制, 让编译器来进行内存管理.在降低程序崩溃,内存管理泄漏等风险的同时,很大程度减少了程序员的 ...
 - block使用小结、在arc中使用block、如何防止循环引用
		
引言 使用block已经有一段时间了,感觉自己了解的还行,但是几天前看到CocoaChina上一个关于block的小测试主题: [小测试]你真的知道blocks在Objective-C中是怎么工作的吗 ...
 - 【Swift学习】Swift编程之旅---ARC(二十)
		
Swift使用自动引用计数(ARC)来跟踪并管理应用使用的内存.大部分情况下,这意味着在Swift语言中,内存管理"仍然工作",不需要自己去考虑内存管理的事情.当实例不再被使用时, ...
 - iOS ARC内存管理
		
iOS的内存管理机制,只要是iOS开发者,不管多长的时间经验,都能说出来一点,但是要深入的理解.还是不简单的.随着ARC(自动管理内存)的流行.iOS开发者告别了手动管理内存的复杂工作.但是自动管理内 ...
 - iOS学习笔记之ARC内存管理
		
iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其 ...
 
随机推荐
- POJ3061 Subsequence(二进制前缀和法律+仿真足)
			
二分法+前缀和法律 满足子序列长度的条件(0,n)之间,sum[x+i]-sum[i]从i元素开始序列长度x和.前缀和可在O(n)的时间内统计 sum[i]的值.再用二分找出满足条件的最小的子序列长度 ...
 - 使用mysqlbinlog工具的基础上及时恢复数据的位置或点
			
使用mysqlbinlog工具的基础上及时恢复的位置或点 MySQL备份一般采取完全备份的形式加日志备份.让我们运行一个完整备份,每天.每小时运行二进制日志备份. 这样在MySQL Server故障后 ...
 - 红帽/CentOS ext4无法格式化大分区  补充ext4格式化方式
			
普通情况下,XFS出现丢数据的情况为海量小文件IO场景.在该场景下,inode占用教大. 通过上文的方式进行格式化,inode数量较小.通过大量測试,能够使用例如以下方法提升mkfs.ext4后文件系 ...
 - Nancy 框架学习
			
Nancy 框架 1.是一个轻量级用于构建http相应的web框架: 2.与mvc类似,有自己的路由机制: 3.可以处理 DELETE , GET , HEAD , OPTIONS , POS ...
 - 前框 (一个)zTree  从数据库树形菜单动态加载
			
这些天做动态菜单使用此插件.现在有一个非常广泛的开源框架,最新QUI框架是菜单部分使用这个插件开发,因此,它是非常值获取深入的研究和探讨,通过使用非常丰富的感觉功能,己开发和编写,官网上有非常详尽的A ...
 - android  adb 不同的方式使用特定的解释
			
本文介绍windows 在程序中使用adb 方法.没有引进adb 该命令. 1) 启动adb 流程.获得输出从管道. 这样的方式的弊端有多少,我也不知道.反正就是各种问题吧.可是眼下我问过非常多朋友. ...
 - nodejs 模拟form表单上传文件
			
使用nodejs来模拟form表单进行文件上传,可以同时上传多个文件. 以前项目里有这个方法,最近在客户那里出问题了,同事说,这个方法从来就没管用过,SO,用了一天时间把这个方法给搞出来了(觉得花费的 ...
 - 配置Apacheserver
			
配置Apacheserver 一.目的 能够有一个測试的server,不是全部的特殊网络服务都能找到免费得! 二.为什么我们要用"Apache"? Apache是眼下使用最广的we ...
 - React实践
			
React实践(一) 该实践取自官方教程:https://github.com/reactjs/react-tutorial 主要是自实现的过程以及一些心得体会 该实践是实现一个评论框. 一个展示 ...
 - Android简单的聊天室开发(client与server沟通)
			
请尊重他人的劳动成果.转载请注明出处:Android开发之简单的聊天室(client与server进行通信) 1. 预备知识:Tcp/IP协议与Socket TCP/IP 是Transmission ...