6

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

4

3 回答 3

10

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

当内存不足的情况发生并且不需要当前视图控制器的视图时,系统可能会选择从内存中删除这些视图。此方法在视图控制器的视图被释放后调用,这是您执行任何最终清理的机会。如果您的视图控制器存储了对视图或其子视图的单独引用,您应该使用此方法来释放这些引用。您还可以使用此方法删除对您为支持视图而创建但在视图消失后不再需要的任何对象的引用。您不应使用此方法发布用户数据或任何其他无法轻松重新创建的信息。

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

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

于 2012-08-24T07:10:50.950 回答
3

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

viewDidUnload方法并不意味着您UIViewController从内存中删除,它只是意味着它的视图从内存中删除(iOS Developer - ViewController 生命周期)。

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

于 2012-08-24T07:16:02.117 回答
2

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

于 2012-08-24T07:09:31.847 回答