我正在使用ARC,但应用程序崩溃,显示收到内存警告。我直接在设备(带有iOS 7.0.2的iPhone 4)上测试应用程序,并使用iOS 6SDK在XCode 5上进行编译。我已经使用了苹果的仪器,我已经分配了大约20MB的LiveBytes。

4-5分钟后,我的应用程序有30mb的内存。

在设备上编译和测试应用程序后,我看到几分钟后崩溃,就在内存警告消息之后。为什么使用仪器不会发生崩溃?然而,我花了一个月的时间试图解决这个问题,但无法得到任何东西,我真的需要帮助。看起来我没有任何泄漏,但我找不到哪里错了。提前感谢您的建议。
发布于 2013-11-03 19:17:27
我解决了这个问题。在我的例子中,内存压力是由于运行循环周期对内存的持续使用造成的。循环每秒执行一次,并处理必须在视图中分析和显示的数据。另外,该项目最初并没有使用ARC。在将项目转换为ARC之后,出现了问题。
在将项目转换为ARC之前,在循环结束时,我直接调用了释放资源。对于ARC,这当然是自动完成的,问题就是这样。因此,对于运行循环的类,我返回到非ARC版本,并使用手动创建的技巧来释放我使用的资源。
自动释放池块提供了一种机制,您可以借此放弃对象的所有权,但避免立即释放该对象的可能性(例如,当您从方法返回对象时)。通常,您不需要创建自己的自动释放池块,但在某些情况下,您必须这样做,或者这样做是有益的。
@autoreleasepool {
// Code that creates autoreleased objects.
}在自动释放池块的末尾,将向在块内接收到自动释放消息的对象发送释放消息-每次在块内向对象发送自动释放消息时,对象都会收到释放消息。
你可以在任何代码段周围放置一个@autoreleasepool块,但是你真的不应该做我认为你正在做的事情。
自动释放比允许ARC为你添加保留和释放调用的效率要低得多,而且它可能不安全。自动释放会将所有对象放入一个“池”中,然后当你超出作用域和/或每当它决定转储该池时,它就会“排空”该池,并且对象的保留计数会减1。
简短的答案是:完全删除@autorelease块,除非Apple在文档或模板中另有说明(例如,main.m中将包含@autorelease short )。
这意味着您的对象可能会在您真正想要它们之前被释放。当你有一个非常紧凑的代码循环,要实例化然后丢弃大量的对象时,@autoreleasepool块更有用。例如,一个For循环处理一个巨大的数据库并分配string对象,然后使用这些string对象填充您创建的类的实例的属性。在这种情况下,当您处于for循环中时,ARC可能不会可靠地释放这些对象,您可能需要创建一个自动释放池。
然而,ARC在紧凑的循环中不做正确的事情并不是很常见。它实际上更多的是一个非ARC的概念,你使用一个NSAutoreleasePool并手动地耗尽它。
我希望我已经帮助其他人解决了同样的问题。
发布于 2015-04-08 20:25:56
#pragma mark - Received Memory Warning
//memory pressure ios
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
if ( [self isViewLoaded] && self.view.window == nil )
{
self.view = nil;
}
// Dispose of any resources that can be recreated.
}https://stackoverflow.com/questions/19253365
复制相似问题