2011-11-07 65 views
5

我试图符合苹果关于在我的应用程序中响应低内存警告的指导原则。准则说:“接收到(低内存警告)后,您的应用程序必须释放尽可能多的内存,释放不需要的对象或清除内存缓存,以便稍后重新创建。”iOS 5 + ARC - 是否将指针分配给指针释放内存?

问题是,如何使用ARC释放内存?

例如,假设我在不在屏幕上的视图的视图层次结构中有图像。在didReceiveMemoryWarning中,我目前通过调用removeFromSuperview将其从视图中移除,但我仍然有一个指向UIImage本身的指针。我是否也应该尝试释放这些内存?怎么样?通过将nil分配给指针?

TIA:约翰

+0

请在指针附近提供更多信息。它是一个伊娃,在一个方法,全球,财产本地? – zaph

+0

那么我正在考虑的是UIImage *实例变量。 – John

+0

好吧,我认为我解决了我的问题1)使用弱引用的子视图和2)分配nil指针如果视图仍然在执行didReceiveMemeoryWarning时(这是我每次在调试器中看到它时) 。主要是,我想我只是意识到,你无法避免一直记忆警告......有时它们是由其他应用程序引起的。你只需要妥善处理它们。修好我的记忆警告处理程序后,我只收到警告一次,而不是每次启动UIImagePickerController。一个很大的改进。 – John

回答

3
  1. 到时候你-didReceiveMemoryWarning的时候,你的观点应该已经自动系统释放和-viewDidUnload应该叫。因此,如果您不持有对视图子视图的引用,则不负责释放视图。否则,如果您持有对您想释放的某些资源的引用,则只需通过为它们分配“nil”为NSObject s来取消您的引用,并为其他类型的引用调用相应的发布函数,例如, CFReleaseCore Foundation对象。

+0

H'mmm ...事情是,我举一些子视图的参考,因为应用程序需要能够修改或删除子视图,作为应用程序正常运行的一部分。当需要时能够说[self.mySubView removeFromSuperview]很容易,而不是在每次需要删除/修改子视图时遍历子视图树。但我想这意味着即使视图被释放,系统也不能释放子视图。如果我的链接很薄弱,子视图是否会被正确释放? – John

+1

当然,你可以使用'__weak',或者你可以在'-viewDidUnload'中简单地将它设置为'nil'。 – an0

+0

在iOS6中viewDidUnload不再被自动调用。您需要使用didReceiveMemoryWarning。 – bkbeachlabs

0

使所有IBOutlet属性具有strong属性。

将所有IBOutlet属性全部设置为nilviewDidUnload

+2

@John特意问到ARC。保留和释放不再使用。 – Undeadlegion