【问题标题】:iphone Application is crashing due to memory pressureiphone应用程序由于内存压力而崩溃
【发布时间】:2014-03-30 20:38:52
【问题描述】:

在我的 iphone 应用程序中,当发送一些数据包时,应用程序在有更多数据包时崩溃,并且它会在 xcode 上发出警报,说由于内存压力而终止应用程序。在我的代码中的几个地方,我在 for 循环中分配了一些对象并将这些分配的对象添加到队列中,所以在添加之后我想在 for 循环中释放这些对象,因为它启用了 ARC 的项目 我无法释放它,我的问题是在这种情况下会有帮助吗?而不是释放它,如果我们将这些对象设置为 nil,它会释放内存(我知道 nil 不会减少保留计数)设置 nil 是否有助于减少内存使用?

说我的代码有点像下面的例子

NSMutableArray* arrObj = [[NSMutableArray alloc]init];
for(i=0; i<=count;i++)
{
  ClassA * Obja = [[classA alloc]initwithdata:xx];
  ClassB * Objb = [[classB alloc]initwithdata:xx];
  ClassC * Objc = [[classC alloc]initwithdata:xx];

  [arrObj addObject:obja]; // Since its ARC we cant release obja will obja=nil this help?
  [arrObj addObject:objb]; // Since its ARC we cant release objb will objb=nil this help?
  [arrObj addObject:objc]; // Since its ARC we cant release objc will objc=nil this help?

}

【问题讨论】:

  • xx 代表什么?是图像数据吗?
  • 你为什么要分配 ClassA * Obja = [[classA alloc]initwithdata:xx];在循环中?
  • 使用instruments:Allocations 准确查看哪些对象会增加您的内存占用。
  • XX 在这里是一些字典,我在循环中分配它

标签: ios iphone objective-c memory-management automatic-ref-counting


【解决方案1】:

当你不再需要它们时,ARC 会自动释放它,你不必将它们设为 nil。

但是如果你有很多临时数据,你可以使用Autorelease Pool Block

while (x < y){
   @autoreleasepool {
      // lot of temporary stuff
   }
}

您可以找到关于 Xcode Instruments 的非常好的和简单的教程 here 来解决内存管理问题。

【讨论】:

  • 感谢您的回复,所以将 nil 设置为对象不会告诉编译器释放? (我在想编译器会立即从内存中删除设置为 nil 的对象)
  • 当你不再持有它的参考时我会释放它。这就是为什么你需要与你的委托的弱连接,否则你将建立一个两个元素相互持有的保留循环。 stackoverflow.com/questions/8449040/…
【解决方案2】:

ARC 不会去掉retainsreleasesautoreleases,它只是为您添加所需的。所以仍然有对retain的调用,还有对release的调用,还有对autorelease的调用。

您应该使用 Allocations 工具来缩小问题范围。 Apple's关于发现内存问题的文章:Locating Memory Issues in Your App

使用@autoreleasepool 块。它们提供了一种机制,您可以通过该机制放弃对象的所有权,但避免立即释放它的可能性。 Apple 的Advanced Memory Management Programming Guide 对此进行了解释:

在自动释放池块结束时,向块内接收到自动释放消息的对象发送释放消息 - 每次在块内向对象发送自动释放消息时,对象都会收到释放消息。

【讨论】:

    【解决方案3】:

    为什么要在循环中分配那些classA、classB和ClassC。考虑将它们分配到外部,并让它们每次都更改数据。这是更好的做法。

    您可能只想清理介于两者之间的数据。

    【讨论】:

      【解决方案4】:

      试试这个

      NSMutableArray* arrObj = [[NSMutableArray alloc]init];
      ClassA * Obja = [[classA alloc]initwithdata:xx];
      ClassB * Objb = [[classB alloc]initwithdata:xx];
      ClassC * Objc = [[classC alloc]initwithdata:xx];
      for(i=0; i<=count;i++)
      {
      [arrObj addObject:obja]; 
      [arrObj addObject:objb]; 
      [arrObj addObject:objc]; 
      }
      

      【讨论】:

        猜你喜欢
        • 2014-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-15
        相关资源
        最近更新 更多