2

在我的iPhone应用程序在发送一些数据包的应用程序崩溃时,有更多的包的数量及其在Xcode中抛出一个警告说终止应用程序由于内存的压力。在我在几个地方,我已经在分配某些对象的for循环以及将这些分配对象队列代码,以便只是补充说,我要释放这些对象中的for循环后,自ARC启用项目我不能释放,我的问题是在这种情况下将无帮助?而不是释放它,如果我们将这些对象零,,将它释放内存(我知道不会降低保留计数)被设置为零,将有助于减少内存使用情况?iPhone应用程序崩溃是由于内存压力

说我的代码是什么样的一些类似下面的例子

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? 

} 
+0

xx代表什么?它是图像数据吗? – Gaurav

+0

你为什么要分配ClassA * Obja = [[classA alloc] initwithdata:xx]; in循环? –

+1

使用工具:分配以准确查看哪些对象会增加内存占用量。 – Andrei

回答

1

当你不再需要他们ARC会自动释放它,你不必到零的。

但i如果你有大量的临时数据,你可以使用一个Autorelease Pool Block

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

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

+0

thanx为你的答复,所以设置零对象不会告诉compliler释放?(我想编译器会立即从内存中删除设置为零的对象) –

+0

当你不再持有引用时,我会释放它。这就是为什么你需要连接到你的代表弱连接,或者你会做一个保留周期,其中两个元素相互拥抱。 http://stackoverflow.com/questions/8449040/why-use-weak-pointer-for-delegation – Laszlo

0

ARC没有摆脱retainsreleasesautoreleases,它只是为您添加所需的。所以仍有电话retain,仍有电话release,仍有电话autorelease

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

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

在自动释放池块的结束,即接收到的块内自动释放消息对象发送一个释放消息对象接收每个时间的释放消息被发送一个自动释放消息在块内。

0

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

你可能只想清除仅之间的数据。

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