2009-07-11 47 views
3
- (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]; 
} 

回答

2

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

所以,你只需要免费查看相关的项目。

就你而言,它看起来像你只需要释放可能在你视图中的UILabels。如果他们被标记为IBOutlets,而不是在分配属性,你要释放它们使用的内存:

self.pointLabel = nil; 
self.accelerometerLabel= nil; 
self.headingLabel= nil; 

这也意味着,在viewDidLoad中,如果你设置你想在其他性能如果它们已经存在,那么确定它们没有被再次分配,因为如果视图被卸载然后再次被重新加载,它可以被再次调用。

这将被调用的原因是如果视图控制器收到内存警告。您可以在模拟器中测试此内存警告,以了解如何调用viewDidUnload和viewDidLoad。

-1

你不需要,如果你运行这个,你会浪费一些实质性的执行时间。使用属性方法将属性设置为零与释放属性是一样的,但要注意一些额外的东西可能会或可能不会发生,具体取决于您如何设置setter方法。

所以我们来看看这段代码。在viewDidUnload方法的最后,所有属性现在都是零。该对象然后被释放,并且您的对象试图释放一打零等左右的对象。现在,Objective-C运行时非常聪明,如果你发送消息给零,(惊喜),什么都不会发生。

所以,你基本上已经有十几行完全没有任何东西。

+0

如果你打算投下一个技术上正确的答案,留下评论解释原因通常是有帮助的...... – 2009-07-11 05:43:00

+0

我不是那个投你一票的人,但我不同意它在技术上是正确的。当UIViewController的视图被卸载时,viewDidUnload被调用。不一定需要调用dealloc,并且 - 根据您的应用程序设计 - 这很可能不会。 – grahamparks 2009-07-11 09:20:26

-1

不,你不应该。

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

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

因此,忽略viewDidUnload中的那些。

相关问题