objective-c strong导致内存泄漏简单案例
例如:
@interface Test:NSObject{
id __strong obj_;
}
-(void) setObject:(id __strong)obj;
@end
@implementation Test
-(id)init{
self=[super init];
if(self){}
return;
}
-(void) setObject:(id __strong) obj{
obj_=obj;
}
@end
那么在调用时如下:
{
1、 id text1=[[Test alloc] init];//A对象 ,目前持有则为:text1 变量,retainCount=1
2、 id text2=[[Test alloc] init] ;//B对象,目前持有则为:text2 变量 ,retainCount=1
3、 [text1 setObject:text2]; //此时,对象A,retainCount=2;持有者为 text1变量 和对象B的变量obj_
4、 [text2 setObject:text1];//同理,对象B,retainCount=2;持有者为 text2变量 和对象A的变量obj_
}
//当text1 生命周期结束时,对象A retainCount自动减一,retainCount=1那么内存不会释放
//同理当text2 生命周期结束时,对象B retainCount 自动减一,retainCount=1 那么内存不会释放
这里应该很清楚,其实对象A、B内部的变量相互引用了,导致内存无法释放。
图解如下:
1、2代码行运行后结果如下图:

代码3执行后如下:

代码4执行后如下:

那么当大括号结束时,text1和text2 变量生命周期结束。会释放各自的持有对象。如下

很显然,对象A和对象B都不会释放内存,内存必然泄漏。
当然有人会问,若只有单方面的赋值呢?还会不会导致内存泄漏?
{
id text1=[[Test alloc] init];//A对象 ,目前持有则为:text1 变量,retainCount=1
id text2=[[Test alloc] init] ;//B对象,目前持有则为:text2 变量 ,retainCount=1
[text1 setObject:text2]; //此时,对象A,retainCount=2;持有者为 text1变量 和对象B的变量obj_
}
那么当然是不会导致内存泄漏了。 仔细分析下就知道了。
当text1 生命周期结束时,对象A retainCount=0, 那么导致对象A必须释放内存,其成员变量_obj,也会被释放,当_obj释放时,B对象的retainCount减1变为1。
然后text2 生命结束时 ,对象B retainCount 会减1变成0,那么对象B内存会释放。
既然这样那有没有好的方案能解决这个问题呢? 答案是:__weak 引用,而__weak 引用并不支持对象。通俗的说retainCount 不会+1;
好吧! 就这样吧......不要总为简单的东西很简单,其实不然越简单的东西在程序的世界里面反而是最难的!.......
objective-c strong导致内存泄漏简单案例的更多相关文章
- python中循环引用导致内存泄漏小案例
首先定义一个Person类和一个Dog类,然后分别实例化对象p和d,给p对象添加一个pet属性 给d对象添加一个master属性此时Person和Dog的应用计数都为2,当del p 和del d后P ...
- Android 非静态内部类导致内存泄漏原因深入剖析
背景 上周发现蘑菇街IM-Android代码里面.一些地方代码编写不当.存在内存泄漏的问题.在和疯紫交流的过程中.发现加深了一些理解,所以决定写一下分析思路,相互学习. 内存泄漏 一个不会被使用的对象 ...
- Java内存泄漏真实案例
内存泄漏:当不再需要一个对象时,垃圾收集器会回收它:如果不需要的对象一直在产生而不被收回,就称作“内存泄漏”. 以下为本人在工作中遇到的内存泄漏的案例: 1.对于大量的请求,使用了Executors. ...
- Android内存溢出、内存泄漏常见案例及最佳实践总结
内存溢出是Android开发中一个老大难的问题,相关的知识点比较繁杂,绝大部分的开发者都零零星星知道一些,但难以全面.本篇文档会尽量从广度和深度两个方面进行整理,帮助大家梳理这方面的知识点(基于Jav ...
- MSDN官方XmlSerializer类导致内存泄漏和性能低
MSDN官方XmlSerializer类使用说明链接: http://msdn.microsoft.com/zh-CN/library/system.xml.serialization.xmlseri ...
- Java内存泄漏简单说明
Java语言的一个关键的优势就是它的内存管理机制.你只管创建对象,Java的垃圾回收器帮你分配以及回收内存.然而,实际的情况并没有那么简单,因为内存泄漏在Java应用程序中还是时有发生的. 下面就解释 ...
- 为什么不取消注册BroadcastReceiver会导致内存泄漏
原始问题是这样 然后扔到了很多Android开发交流群里. 接着产生了很多的见解,我感觉比较靠谱的有以下: 网友对我问题的回答 1.onDestroy被回调代不代表Activity被回收了? 官方是这 ...
- 面试官:小伙子,你给我说一下Java中什么情况会导致内存泄漏呢?
概念 内存泄露:指程序中动态分配内存给一些临时对象,但对象不会被GC回收,它始终占用内存,被分配的对象可达但已无用.即无用对象持续占有内存或无用对象的内存得不到及时释放,从而造成的内存空间浪费. 可达 ...
- Android - 看似内存泄漏,实则不是,记一次内存泄漏的案例分析
APP中常常会存在内存泄漏的问题,一个简单的测试方法是,多次进入和退出同一页面(Activity),使用adb shell中的dumpsys meminfo com.android.settings ...
随机推荐
- Hbase之取出行数据指定部分+版本控制(类似MySQL的Limit)
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.CellScanner; import org. ...
- stream流批量读取并合并文件
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.F ...
- OI中的代码调试
作为一位OIer,代码调试的能力必不可少. 今天梳理一下自己进行代码调试的方法,下面只是一些个人的总结. 代码的评价有三部分: 正确性 强健性 高效性 检查也应该从这三部分出发. [正确性] 打完代码 ...
- 8个实用的页面布局和用户界面jQuery插件
网页设计师和网页开发人员在做项目的时候可能会有一些页面的布局或者对于UI有一些特定的要求.可能一些需求不能单独使用CSS就能实现的.于是很多时候开发人员都会消耗大量的时间和精力去写一些JS来协助实现. ...
- 《javascript高级程序设计》第四章 Variables,scope,and memory
4.1 基本类型和引用类型的值 primitive and reference values 4.1.1 动态的属性 dynamic properties 4.1.2 复制变量值 copying va ...
- js 时间处理
1.格式化时间 function GetDateTimeFormatter(value) { if (value == undefined) { return &q ...
- hdu5884 Sort(二分+k叉哈夫曼树)
题目链接:hdu5884 Sort 题意:n个有序序列的归并排序.每次可以选择不超过k个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问k最小是多少. 题解:先二分k,然后在k给 ...
- (转载整理)SAP ERP常用表
abap 常用表 GL部分:FAGLFLEXT(FMGLFLEXT) 新总账汇总表 GLT0 旧总帐汇总表 SKA1 总账科目主记录 (科目表) ...
- OUT函数及其熟练使用,split的用法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- arrow css
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...