我仍然在学习iOS开发并已与各种教程和书籍的工作。 一些弧前,一些与ARC。
在某些情况下,我们要教给释放所有属性和viewDidUnload一个视图控制器的子视图,但在某些情况下,有人告诉我,这是不再需要。
有人可以给一个明确的答案? 在iOS 5以上,并有一个做全:
-(void)viewDidUnload
{
[super viewDidUnload];
self.photoViewCell = nil;
self.photoImageView = nil;
self.firstNameTextField = nil;
self.lastNameTextField = nil;
}
... 或不? 如果是这样,这只是对于那些UIView的后裔或者是它的视图控制器的所有属性的属性?
谢谢
所以,每个视图有许多业主。 当该“拥有者计数”(通常被称为retainCount)达到0时,该对象被销毁。
在iOS 5中,我们现在有弱引用,这基本上意味着“不拥有此对象”。
iOS 5中之前,在我们的头文件,你会看到
IBOutlet UILabel *myLabel;
而且这个标签被添加到XIB文件的视图。 myLabel有2名业主在这种情况下:这是上海华(在XIB文件中的视图)和视图控制器(由具有IBOutlet中)。 当viewDidUnload得到的调用,视图控制器的观点已被释放,因此它的myLabel的所有权已经一去不复返了。 所以myLabel在这一点上只有1个业主,视图控制器。 因此,我们需要释放它在viewDidLoad中,以确保它没有任何业主等被破坏。
与iOS 5,你经常会看到这个代替
__weak IBOutlet UILabel *myLabel
这是说,我们不希望视图控制器是myLabel的所有者。 所以,唯一的所有者是视图控制器的看法。 因此,当viewDidUnload得到的调用,视图控制器的观点已被释放,并因此其myLabel的所有权也得到了释放。 在这种情况下,myLabel现在已经没有业主和它的内存被释放。 没有必要为self.myLabel =零; 那里。
因此,与iOS 5,该建议是让所有IBOutlets的弱引用。 有了这个,你甚至都不需要实现viewDidUnload,因为所有的内存已经采取为你照顾。
但是,即使您正在使用的iOS 5,如果你的IBOutlets不弱引用,你需要在viewDidUnload代码。
viewDidUnload无关与保留计数,自动或以其他方式。 当一个视图被卸载由于存储器的压力,这意味着你应该也为零,此方法将被调用(和释放,非ARC),您有到强引用视图的元件。 如果不这样做可能意味着,当内存压力下,这可能会导致它被操作系统关闭您的应用程序不能释放足够的内存。
您可以使用viewDidUnload管理内存,如果你的应用程序应得的。
但不要做
myInstanceVariable = nil;
你失去了你的参考内存位置,你的变量的值居住。
=零不释放存储器。 不过,你的对象已被释放。 因此,使用的retainCount和保留/释放。
如果您在viewDidUnload无你的对象,你不能在dealloc中释放! 注意!!!
如果你知道,你做什么,你可以释放和nil在viewDidUnload你的对象。
弧:
使用ARC,你不能手动释放,即使我认为你不能这样做。 ARC需要的照顾。 只需使用@properties尽可能多的,你可以用(弱/强)属性,让getter和setter做的工作适合你。 你可以声明在.m文件@properties是(像在类扩展)。
规则很简单:为你坚强希望拥有的对象,弱的对象,你不想迷失在一个保留周期并持有所有权。 ARC没有休息在几乎所有情况。 使用弱为代表的例子。
零对象,你知道在哪里,你会不会向他们发送消息,否则不。
文章来源: So what's the deal with ARC and releasing properties/subviews on viewDidUnload