【问题标题】:Memory leaking issue in Objective c AppObjective c App中的内存泄漏问题
【发布时间】:2013-12-11 07:37:59
【问题描述】:

在我的 iOS 应用中,ARC 被禁用。当我使用仪器工具检查我的代码时,我在我的代码中发现了一些内存泄漏问题,如下所述。

Obj1 是一个在.h 文件中声明的对象(其类型为classA)。

我使用代码在.m文件中设置Obj1的值:

self.Obj1 = [[classA alloc]init];

我在dealloc方法中释放Obj1

这段代码运行良好。但显示内存泄漏问题。

我怎样才能避免这个内存泄漏问题??

【问题讨论】:

    标签: ios objective-c memory-management memory-leaks


    【解决方案1】:

    使用下面的代码:

    self.Obj1 = [[[classA alloc]init]autorelease];
    

    只有当视图没有被使用或卸载时才会调用Dealloc。

    【讨论】:

      【解决方案2】:

      如果您使用 NSZombieEnabled 宏来处理已释放对象的工作,所有对象(甚至已释放)都将具有至少 1 个保留计数,并且工具会将所有对象显示为“泄漏”。当您处理内存泄漏时,只需关闭此宏即可。 参考技术说明: https://developer.apple.com/library/ios/technotes/tn2239/_index.html

      【讨论】:

        【解决方案3】:

        如果你让一个属性保持 Obj1 意味着递增 1,那么在你分配这个对象之后递增 1,所以它的值保持 2。

        使用下面的代码:

        ClassA *objC = [[classA alloc]init];
        self.Obj1 = objC;
        [objC release];
        

        【讨论】:

          【解决方案4】:

          有很多方法可以解决这个问题:

          首先,

          self.Obj1 = [[[classA alloc]init]autorelease];
          

          第二,

          Obj1 = [[classA alloc]init];
          ...
          // use self.Obj1 in the code
          ...
          [Obj1 release];
          

          第三,

          self.Obj1 = [[classA alloc]init];
          ...
          [self.Obj1 release];
          

          使用其中任何一种。

          【讨论】:

            【解决方案5】:

            您可以删除self.,只删除Obj1 = [[classA alloc]init];。 因为当你调用self.的时候,又是retain了对象,所以self.Obj1 = [[classA alloc]init];之后,object的retain count是2。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-07-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-02-04
              • 2011-06-07
              • 1970-01-01
              相关资源
              最近更新 更多