ARC引用计数dealloc,并释放

时间:2012-03-29 19:28:02

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

我有点困惑。我正在创建一个带故事板的应用程序,并在iPad上运行1.应用程序使用了大量内存,因此达到120mb,崩溃。相应的我已经理解为删除这个问题你需要释放,dealloc ...重点是,ARC应该是自动的。事实上,如果我添加例如:[label1 release];它给了我一个错误。但是这个ARC自动释放和dealloc似乎不起作用!这是因为有不同的方法可以用ARC发布吗?

enter image description here

3 个答案:

答案 0 :(得分:4)

您无需使用ARC手动保留/释放/自动释放。但是,如果您对许多未使用的对象有活动引用,它们仍将保留在内存中。使用Instruments描述您的应用程序,它将显示您为每个类创建的对象数量以及它们消耗的内存量。

使用ARC,你仍然需要考虑内存使用情况,你不必担心内存泄漏。

NSObject *bigMemObj = [[BigMemClass alloc] init];
//This creates the object in memory. In both arc and manual counting the retain count is 1

//Do stuff

//Prior to ARC you would have had to call [bigMemObj release]; before setting the variable to nil
bigMemObj = nil
//With ARC you don't have to do anything. The compiler inserts the release at compile time

另请阅读声明iVars __strong vs __weak。

的文档

如果不查看代码,很难确定消耗所有内存的内容,但希望这可以帮助您确定从哪里开始查找。

答案 1 :(得分:0)

您应该在每个方法中实现@autoreleasePool{}。实质上,每种方法都如下所示:

-(void)methodName{
@autoreleasePool{
//do method stuff
}
}

这将确保在退出autoreleasePool时正确释放内存。

答案 2 :(得分:0)

我不能投票支持,否则我愿意。我认为Alessandro正在询问ARC vs使用release和dealloc,而不是他正在加载的内容!

所以,Alessandro,你的理解是正确的,因为你不会释放或释放你的ARC。因此,如果您使用ARC,那些人将无法工作。此外,没有替代发布/ dealloc,因为ARC没有使用它。

我的建议是看看你在占用所有内存的应用中使用了什么。例如,你有大量的图片吗?保持所有图形尽可能小,与iPad的分辨率相匹配。特别是iPad 1,它没有"视网膜显示器"。

您可以在ARC中使用自动释放池。这里有一些关于何时使用它们的文档: NSAutoreleasePool Class Reference Advanced Memory Management Programming Guide: About Memory Management