我们如何在ARC中显式调用垃圾收集器?此外,我们是否有办法决定何时释放ARC中的内存?

4

我是一名iPhone开发人员。在我的应用程序中,我正在使用ARC。我分配对象,并且一旦使用完毕,就将其赋值为“nil”。除此之外,还有其他需要做的以释放内存吗?

此外,在ARC中有没有一种方法可以显式调用垃圾收集器?是否有一种方法可以决定何时释放ARC中的内存?

2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
9

ARC不是垃圾回收器——将其视为手动引用计数管理,编译器代表您添加引用计数操作。

您可以做的一件好事是创建自动释放池。因为编译器添加了保留、释放和自动释放消息,所以您的对象最终会进入自动释放池。请考虑:

@autoreleasepool {
  ..create several temporary objects...
} // << now the autorelease pool is popped, and delayed release messages are sent

创建自动释放池非常便宜,可以真正降低内存消耗并确保您的对象资源能够及时返回。


3

ARC没有垃圾回收,因此没有需要调用的东西。如果您控制对象的范围和所有权,则ARC将为您管理内存使用。

除了将引用分配为'nil'或让引用超出范围之外,唯一需要考虑的是是否有一些额外的引用指向该对象(例如将其放入NSArray中),这些引用需要保留该对象。


我并不是在说这是你的错,但是,“ARC不是垃圾回收器”,“ARC会处理你的垃圾”,“ARC没有垃圾回收”- 我希望有人有更好的方法来教初学者这些东西。 - hooleyhoop
@hooleyhoop - 我不明白你想说什么。在适当的定义和条件下,其中两个是正确的陈述。而“Arc会处理你的垃圾”的唯一问题就是ARC更多地是预防而不是处理它。 - Phillip Mills
抱歉我在捣乱。我觉得这很困惑,但我自己也做不得更好(我不满意它很难解释,而不是我认为你做得不好)。 - hooleyhoop
1
虽然这个答案中的所有内容都是正确的,但 @justin 的更加完整。有些情况下,需要使用 @autoreleasepool 块来防止僵尸对象在内存中累积(ARC 最终会释放它们,但可能要等到线程本身终止)。除非您的作用域也包括一个 @autoreleasepool 块,否则并不是所有东西离开作用域时都会被释放。 - aroth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,