那么什么是与ARC的交易以及在viewDidUnload上发布属性/子视图

时间:2012-06-01 15:48:54

标签: ios automatic-ref-counting xcode4.3 objective-c-2.0

我还在学习iOS开发,并且一直在使用各种教程和书籍。一些预ARC,一些使用ARC。

在某些情况下,我们被教导在viewDidUnload上发布ViewController的所有属性和子视图,但在某些情况下我被告知不再需要它。

有人可以给出明确的答案吗?在iOS 5+中,是否需要完成整个过程:

-(void)viewDidUnload
{
  [super viewDidUnload];
  self.photoViewCell = nil;
  self.photoImageView = nil;
  self.firstNameTextField = nil;
  self.lastNameTextField = nil;
}

......不是吗?如果是这样,这仅适用于作为UIView后代的属性,还是适用于ViewController的所有属性?

由于

3 个答案:

答案 0 :(得分:8)

因此每个视图都有许多所有者。当“所有者计数”(通常称为retainCount)达到0时,该对象将被销毁。

在iOS 5中,我们现在有弱引用,这实质上意味着“不拥有此对象”。

在iOS 5之前,在我们的头文件中,您会看到

IBOutlet UILabel *myLabel;

此标签已添加到XIB文件的视图中。在这种情况下,myLabel有2个所有者:它是superview(XIB文件中的视图)和视图控制器(通过拥有IBOutlet)。当调用viewDidUnload时,视图控制器的视图已被释放,因此它对myLabel的所有权已经消失。所以myLabel此时只有1个所有者,即视图控制器。因此我们需要在viewDidLoad中释放它以确保它没有任何所有者,因此被销毁。

使用iOS 5,你会经常看到这个

__weak IBOutlet UILabel *myLabel

这就是说我们不希望视图控制器成为myLabel的所有者。所以唯一的所有者是视图控制器的视图。因此,当调用viewDidUnload时,视图控制器的视图已经被释放,因此它的myLabel所有权也已被释放。在这种情况下,myLabel现在没有所有者,它的内存被释放。 self.myLabel = nil;那里。

因此,对于iOS 5,建议将所有IBOutlet作为弱引用。有了这个,您甚至不需要实现viewDidUnload,因为已经为您处理了所有内存。

但即使您使用的是iOS 5,如果您的IBOutlets不是弱引用,您也需要在viewDidUnload中使用该代码。

答案 1 :(得分:0)

viewDidUnload与保留计数无关,自动或其他方式。当由于内存压力而卸载视图时,将调用此方法,这意味着您还应该为您拥有强引用的视图的nil(和释放,非ARC)元素。如果不这样做可能意味着您的应用程序在内存压力下无法释放足够的内存,这可能会导致操作系统关闭它。

答案 2 :(得分:0)

如果您的App值得,可以使用viewDidUnload来管理内存。

但不要做

myInstanceVariable = nil;

您放弃了对内存位置的引用,其中变量的值存在。

= nil不释放内存。但是,您的对象必须被取消分配。因此使用retainCount和retain / release。

如果你在viewDidUnload中没有你的对象,你就无法在dealloc中释放!注意!!!

如果你知道,你做了什么,你可以在viewDidUnload中释放和取消你的对象。

ARC:

使用ARC,您不能手动发布,即使我认为您不能这样做。 ARC负责这一点。 只需使用@properties尽可能使用(弱/强)属性让getter和setter为您完成工作。您可以在.m文件中声明@properties(例如在类扩展中)。

简单规则:对于您想拥有的对象强大,对象弱,您不希望在保留周期中迷失并保持所有权。 ARC几乎在所有情况下完成其余工作。例如,对代表使用弱。

无对象,您确定,您不会向他们发送消息,否则不会。