例如:

@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导致内存泄漏简单案例的更多相关文章

  1. python中循环引用导致内存泄漏小案例

    首先定义一个Person类和一个Dog类,然后分别实例化对象p和d,给p对象添加一个pet属性 给d对象添加一个master属性此时Person和Dog的应用计数都为2,当del p 和del d后P ...

  2. Android 非静态内部类导致内存泄漏原因深入剖析

    背景 上周发现蘑菇街IM-Android代码里面.一些地方代码编写不当.存在内存泄漏的问题.在和疯紫交流的过程中.发现加深了一些理解,所以决定写一下分析思路,相互学习. 内存泄漏 一个不会被使用的对象 ...

  3. Java内存泄漏真实案例

    内存泄漏:当不再需要一个对象时,垃圾收集器会回收它:如果不需要的对象一直在产生而不被收回,就称作“内存泄漏”. 以下为本人在工作中遇到的内存泄漏的案例: 1.对于大量的请求,使用了Executors. ...

  4. Android内存溢出、内存泄漏常见案例及最佳实践总结

    内存溢出是Android开发中一个老大难的问题,相关的知识点比较繁杂,绝大部分的开发者都零零星星知道一些,但难以全面.本篇文档会尽量从广度和深度两个方面进行整理,帮助大家梳理这方面的知识点(基于Jav ...

  5. MSDN官方XmlSerializer类导致内存泄漏和性能低

    MSDN官方XmlSerializer类使用说明链接: http://msdn.microsoft.com/zh-CN/library/system.xml.serialization.xmlseri ...

  6. Java内存泄漏简单说明

    Java语言的一个关键的优势就是它的内存管理机制.你只管创建对象,Java的垃圾回收器帮你分配以及回收内存.然而,实际的情况并没有那么简单,因为内存泄漏在Java应用程序中还是时有发生的. 下面就解释 ...

  7. 为什么不取消注册BroadcastReceiver会导致内存泄漏

    原始问题是这样 然后扔到了很多Android开发交流群里. 接着产生了很多的见解,我感觉比较靠谱的有以下: 网友对我问题的回答 1.onDestroy被回调代不代表Activity被回收了? 官方是这 ...

  8. 面试官:小伙子,你给我说一下Java中什么情况会导致内存泄漏呢?

    概念 内存泄露:指程序中动态分配内存给一些临时对象,但对象不会被GC回收,它始终占用内存,被分配的对象可达但已无用.即无用对象持续占有内存或无用对象的内存得不到及时释放,从而造成的内存空间浪费. 可达 ...

  9. Android - 看似内存泄漏,实则不是,记一次内存泄漏的案例分析

    APP中常常会存在内存泄漏的问题,一个简单的测试方法是,多次进入和退出同一页面(Activity),使用adb shell中的dumpsys meminfo com.android.settings ...

随机推荐

  1. JDK环境变量安装正确还报错的情况解决方案

    环境变量 JAVA_HOME , PATH 都已配置完毕,并且 java -version也显示正确如下 E:\apache-tomcat-8.0.30-windows-x64\apache-tomc ...

  2. Python核心编程-闭包

    百度搜了一下闭包的概念:简而言之,闭包的作用就是在外部函数执行完并返回后,闭包使得收机制不会收回函数所占用的资源,因为内部函数的执行需要依赖外函数中的变量.这是对闭包作用的非常直白的描述,不专业也不严 ...

  3. Nemo Documents – 给文件添加标签 以日历的形式将文件呈现出来,很像 Outlook,你可以根据年、月、日来查看不同类型的文档

    Nemo Documents – 给文件添加标签   scavin(Google+) on 2012.03.28. Nemo Documents 是款文件组织管理工具(文档管理器),不是街道大妈胜似大 ...

  4. testng标签运行顺序

    testng的annotations运行顺序为: @BeforeSuite @BeforeTest @BeforeClass @BeforeMethod @AfterMethod @AfterClas ...

  5. mysql设置编码

    1.修改数据库的编码   将数据库(test)的编码方式修改为utf8,如:   ALTER DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE ut ...

  6. 1.1 ASP.NET MVC简介

    1.什么是ASP.NET MVC? (1)它是个怎么样的产品? ASP.NET MVC是微软公司.NET平台上的一个Web开发框架,它为开发者提供了一种构建结构良好的Web应用程序的方式.自2007年 ...

  7. VBA提高速度的技巧

    此贴原转自EH论坛,我自己有所修改 [编者按]速度是程序设计永恒的热门话题,虽然速度技巧在各种语言之间可以相互借鉴,但差别有时也会很大,比如VC中由于字符串的存储方式决定了判断空串使用len函数更快, ...

  8. .net 时间戳和日期互转 【转】http://www.cnblogs.com/zhuiyi/p/5307540.html

    .net 时间戳和日期互转 1.时间戳转日期public static DateTime IntToDateTime(int timestamp){ return TimeZone.CurrentTi ...

  9. js中String.prototype.format類似于.net中的string.formitz效果

    String.prototype.format = function(args) { if (arguments.length>0) { var result = this; if (argum ...

  10. Linux配置邮箱发送(MUTT/MSMTPQ)

    配置邮箱发送 http://www.ilanni.com/?p=10589