--------- 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. JVM Input Arguments Lookup (JMX)(转)

    JVM Input Arguments Lookup (JMX) Maps JVM input arguments -- but not main arguments -- using JMX to ...

  2. Java实现 Base64、MD5、MAC、HMAC加密(转)

    开始对那些基本的加密还不怎么熟练,然后总结了些,写了一个测试:支持 Base64.MD5.MAC.HMAC加密,长话短说,我们都比较喜欢自己理解,看代码吧! 采用的输UTF-8的格式... packa ...

  3. 2014 ACM湖南匹配10会议省赛

    2014湖南游戏..... 1:牡丹江Regional有些球队没来的冲突 2:题目比較水 3:队友神勇发挥 最终在开局不利的情况下完毕了翻盘,拿到了第二名.....没有抓住机会顺势夺冠还是非常遗憾的. ...

  4. POJ2352_Stars(段树/单点更新)

    解决报告 意甲冠军: 坐标.查找在数星星的左下角每颗星星. 思考: 横轴作为间隔,已知的输入是所述第一到y排序再次x次序.每次添加一个点来查询点x多少分离开坐标,然后更新点. #include < ...

  5. Android 应用程序启动过程源代码分析

    本文转自:http://blog.csdn.net/luoshengyang/article/details/6689748 前文简要介绍了Android应用程序的Activity的启动过程.在And ...

  6. div+js 弹出层

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <t ...

  7. Nginx搭建反向代理服务器过程详解(转)

    一.反向代理 我们都知道,80端口是web服务的默认端口,其他主机访问web服务器也是默认和80端口进行web交互,而一台服务器也只有一个80端口,这是约定俗成的标准. 我们来看下面两个场景: 1.服 ...

  8. 世界杯推动彩票APP爆发,谁将会笑到最后?

        巴西世界杯的火爆上演不只给球迷们带来了一场华丽的足球盛宴,对网络彩票行业而言,这也是一次千载难逢的商机. 只是,并不是全部玩家都能攫取理想的商业利益,网络彩票的角逐宛如世界杯的比赛一样,有人晋 ...

  9. Entity Framework笔记(二)

    前几日学习了在VS2010Console项目中使用Entity Framework,并且使用Code First模式.通过编写Model类,来生成数据库对应的表.并且,往表中写入数据以及获取表中的所有 ...

  10. cuda vector addition

    http://webgpu.hwu.crhc.illinois.edu/ // MP 1 #include <wb.h> __global__ void vecAdd(float * in ...