繁体   English   中英

ARC下-viewDidUnload中的弱属性和强属性

[英]Weak and strong properties in -viewDidUnload under ARC

我是iPhone开发的新手。 我在项目中使用ARC。 据我了解使用ARC,我们不必手动释放任何对象。 但是,我观察到在某些地方,即使在使用ARC之后,人们也会在ViewDidUnload中将对象明确设置为nil。

例如,在.h文件中,我有类似以下内容:

@property (unsafe_unretained, nonatomic) IBOutlet MKMapView *mapViewOutlet;
@property (unsafe_unretained, nonatomic) IBOutlet UIToolbar *toolBar;
@property (strong,nonatomic) NSMutableArray *dataArray;

和.m如下:

- (void)viewDidUnload
{
     [self setMapViewOutlet:nil];
     [self setToolBar:nil];
     [super viewDidUnload];
     self.dataArray=nil;
}

我的问题是,即使在ARC下,是否真的有必要在ViewDidUnload中显式指定nil?

viewDidUnload方法的全部目的是释放不需要的数据,以释放内存。 阅读文档

当发生内存不足的情况并且不需要当前视图控制器的视图时,系统可能会选择从内存中删除这些视图。 释放视图控制器的视图之后,将调用此方法,这是您执行任何最终清理的机会。 如果视图控制器存储对视图或其子视图的单独引用,则应使用此方法释放这些引用。 您也可以使用此方法删除对您创建的支持视图的所有对象的引用,但是由于视图已消失,因此不再需要这些对象。 您不应使用此方法来释放用户数据或任何其他不易重新创建的信息。

所以你设置属性,以nil 现在为了释放对象和帮助系统释放一些内存。 但这当然取决于属性类型-强属性是“您的”,只有您可以决定是否立即释放它们(通过设置为nil )。 弱属性可能已经为nil ,例如,如果它们指向与主视图一起释放的某些视图,则该属性为nil unsafe_unretained属性是一种特殊的野兽。 它们指向的对象可能已经释放,但这并不意味着它们会自动设置为nil 因此,您应该使用一种“较安全”的属性类型(强/弱),或者在此处将不安全的属性设置为nil ,以确保以后不再使用已发布的对象。 在这种情况下,没有硬性规定,您必须考虑情况及其对各种属性的含义。

顺便说一句, viewDidUnload在iOS 6中已被弃用,在低内存条件下不再释放任何视图。 您仍然会收到didReceiveMemoryWarning回调,因此,您可以根据需要释放一些资源。 再次,我建议您阅读文档并进行一些测试,以了解会发生什么并决定应该做什么。

ARC将仅释放不持有对对象的强引用的属性。 在您的情况下,这些都是强引用,因此除非明确将它们设置为nil,否则将保留它们。

viewDidUnload方法并不意味着您的UIViewController已从内存中删除,而只是意味着其视图已从内存中删除( iOS开发人员-ViewController lifecycle )。

在这种情况下,除非显式设置为nil,否则UIViewController仍保留在内存中,因此也保留在其属性中。

使用unsafe_unretained时,应将其分配给nil,因为它不会隐式分配给nil,在弱引用的情况下,它将隐式分配给nil,因此为了避免任何悬空引用,您需要将其分配给nil如果是unsafe_unretained。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM