Iphone 我是否需要在viewDidLoad中将这些变量设置为nil,就像我在这段代码中所做的那样?

Iphone 我是否需要在viewDidLoad中将这些变量设置为nil,就像我在这段代码中所做的那样?,iphone,cocoa-touch,Iphone,Cocoa Touch,你不必这么做,如果你运行这个,你将浪费大量的执行时间。使用property方法将属性设置为nil与释放属性是一样的,但需要注意的是,根据设置setter方法的方式,可能会发生一些额外的内容,也可能不会发生 让我们浏览一下这段代码。在viewDidUnload方法的末尾,所有属性现在都为零。然后对象被释放,并且您的对象尝试释放十几个nil对象。现在,Objective-C运行时非常智能,如果您向nil发送消息,(惊喜)什么也不会发生 所以你基本上有十几行代码完全没有作用。不,你不应该 如果您像上面

你不必这么做,如果你运行这个,你将浪费大量的执行时间。使用property方法将属性设置为nil与释放属性是一样的,但需要注意的是,根据设置setter方法的方式,可能会发生一些额外的内容,也可能不会发生

让我们浏览一下这段代码。在viewDidUnload方法的末尾,所有属性现在都为零。然后对象被释放,并且您的对象尝试释放十几个nil对象。现在,Objective-C运行时非常智能,如果您向nil发送消息,(惊喜)什么也不会发生

所以你基本上有十几行代码完全没有作用。

不,你不应该

如果您像上面的代码那样做,那么您是在浪费精力

通过在viewDidUnload中将它们设置为nil,它们将经历一个释放和自动保留的过程,这意味着,当代码到达dealloc时,它们实际上被释放并且为nil,并且您正在为nil执行另一个释放。 释放nil对象可能不稳定


因此,忽略viewDidUnload中的视图。

调用viewDidUnload的原因是您的视图正在被释放,任何视图资源都应该被释放

因此,您只需要自由查看相关项目

在您的情况下,看起来您只需要释放视图中可能存在的UILabel。如果它们被标记为IBOutlets而不在assign properties中,则您希望释放它们使用的内存:

- (void)viewDidUnload {
  self.GPSArray = nil;
  self.accelerometerArray = nil;
  self.headingArray = nil;
  self.managedObjectContext = nil;
  self.locationManager = nil;
  self.pointLabel = nil;
  self.accelerometerLabel= nil;
  self.headingLabel= nil;
  self.startStop = nil;
  self.lastAccelerometerReading = nil;
  self.lastGPSReading = nil;
  self.lastHeadingReading = nil;
}


- (void)dealloc {
  [GPSArray release];
  [accelerometerArray release];
  [headingArray release];
  [managedObjectContext release];
  [locationManager release];
  [pointLabel release];
  [accelerometerLabel release];
  [headingLabel release];
  [startStop release];
  [lastAccelerometerReading release];
  [lastGPSReading release];
  [lastHeadingReading release];
  [super dealloc];  
}
这也意味着,在viewDidLoad中,如果您正在设置其他属性,您希望确保这些属性已存在时不会再次被分配,因为如果卸载视图,然后再次重新加载,则可以再次调用该属性


调用此命令的原因是,如果视图控制器收到内存警告。您可以在模拟器中测试此内存警告,以查看viewDidUnload和viewDidLoad的调用方式。

如果您打算否决一个技术上正确的答案,请留下评论,解释为什么……我不是否决您的答案的人,但我不同意这在技术上正确。卸载UIViewController的视图时调用viewDidUnload。之后不一定会调用dealloc,而且——取决于你的应用程序设计——很可能不会这样做。@grahamparks fair=)。我几乎从来没有看到过这个调用,除非接近释放,但我想如果他收到内存警告并决定释放该视图,那么它就会启动。
self.pointLabel = nil;
self.accelerometerLabel= nil;
self.headingLabel= nil;