• 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;

       好吧! 就这样吧......不要总为简单的东西很简单,其实不然越简单的东西在程序的世界里面反而是最难的!.......

  • 相关阅读:
    github常用项目汇总
    javaweb Servlet接收Android请求,并返回json数据
    Hibernate 工具类
    JDBC 工具类
    050 Android 百度地图的使用
    Hibernate 连接数据库,数据库返回数据超过限制报错
    049 Android Fragment向另一个Activity传值
    java 实用Util汇总
    关于The requested PHP extension ext-pdo_sqlite * is missing from your system. Install or enable PHP's pdo_sqlite extension.的解决
    Symfony命令大全
  • 原文地址:https://www.cnblogs.com/kingbo/p/3740849.html
Copyright © 2020-2023  润新知