在我的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?
}
答案 0 :(得分:1)
当你不再需要它时,ARC会自动释放它,你不必为那些而烦恼。
但是如果你有很多临时数据,你可以使用Autorelease Pool Block。
while (x < y){
@autoreleasepool {
// lot of temporary stuff
}
}
您可以找到关于Xcode Instruments的非常好且简单的教程here来解决内存管理问题。
答案 1 :(得分:0)
ARC
没有摆脱retains
,releases
和autoreleases
,只是为您添加了必需的内容。因此,仍然有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];
}