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

时间:2012-08-24 06:59:55

标签: iphone objective-c xcode ipad automatic-ref-counting

我是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?

3 个答案:

答案 0 :(得分:10)

viewDidUnload方法的重点是释放你并不真正需要的数据,以释放内存。阅读the documentation

  

当出现内存不足的情况和当前视图控制器时   如果不需要视图,系统可能会选择从中删除这些视图   记忆。在视图控制器的视图之后调用此方法   已经发布,你有机会进行任何最后的清理工作。如果你的   视图控制器存储对视图或其视图的单独引用   子视图,您应该使用此方法来释放这些引用。您   也可以使用此方法删除对您的任何对象的引用   创建以支持视图但现在不再需要了   观点消失了。您不应该使用此方法来释放用户数据或   任何其他无法轻易重建的信息。

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

顺便说一下,{6}中的viewDidUnload已被弃用,在低内存条件下不再发布任何视图。您仍然会收到didReceiveMemoryWarning回调,以便您可以根据需要释放一些资源。同样,我建议你阅读文档并运行一些测试,看看会发生什么,并决定你应该做什么。

答案 1 :(得分:3)

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

viewDidUnload方法并不意味着您的UIViewController已从内存中移除,只是意味着其视图已从内存中移除(iOS Developer - ViewController lifecycle)。

在这种情况下,您的UIViewController会保留在内存中,因此也会保留在内存中,除非它们显式设置为nil。

答案 2 :(得分:2)

当你使用unsafe_unretained时,你应该将它指定为nil,因为它不会被隐式赋值为nil,其中弱引用的情况下它将被隐式分配给nil.So为了避免任何悬空引用你需要在unsafe_unretained的情况下分配给nil。