iphone应用程序由于内存压力而崩溃

时间:2014-02-27 12:10:32

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

在我的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?

}

4 个答案:

答案 0 :(得分:1)

当你不再需要它时,ARC会自动释放它,你不必为那些而烦恼。

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

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

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

答案 1 :(得分:0)

ARC没有摆脱retainsreleasesautoreleases,只是为您添加了必需的内容。因此,仍然有retain来电,仍然有release来电,仍有来电autorelease

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

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

  

在自动释放池块的末尾,在块中接收到自动释放消息的对象被发送一个释放消息 - 一个对象在每次在块中发送自动释放消息时都会收到释放消息。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

试试这个

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]; 
}