2010-06-01 102 views
3

如果我有如下一个的viewController设置:内存管理&viewDidUnload?

@interface MapViewController : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate> { 
    CLLocationManager *locationManager; 
} 

-(void)viewDidLoad { 
    [super viewDidLoad]; 
    locationManager = [[CLLocationManager alloc] init]; 
} 

,当涉及到内存管理,我应该将释放两个viewDidUnload & dealloc的?

-(void)viewDidUnload { 
    [locationManager release]; 
    locationManager = nil; 
    [super viewDidUnload]; 
} 


-(void)dealloc { 
    [locationManager release]; 
    [super dealloc]; 
} 

欢呼加里

编辑:

[超级的dealloc]移至底部按院长类的意见。

+0

只要注意 - 你应该把[超级dealloc]作为_last_行在你的dealloc方法中。否则,当您尝试释放locationManager时,您可能会遇到崩溃,因为内存可能已经被另一个对象使用。 (非常不可能,但需要注意的地方) – deanWombourne 2010-06-01 14:44:16

+0

谢谢Dean,我的错误,但需要记住的好,再次感谢。 – fuzzygoat 2010-06-01 15:16:52

+0

@dean:如果尚未发布locationManager,那么locationManager的内存如何用于另一个对象? (指发布的原始代码) – progrmr 2010-06-01 16:54:36

回答

6

简短的回答:

除非你正在创建/其保留在viewDidLoad中(或XIB),不viewDidUnload释放。

龙答:

viewDidUnload用于释放任何在创建视图时,你可能已经做出 - 这包括在viewDidLoad中的东西,但也包括那是从厦门国际银行文件中创建IBOutlet中的属性。这些应该全部被释放并且在viewDidUnload中设置为零。

其他任何东西都应该在dealloc中发布。

这个想法是,如果调用viewDidUnload来释放一些内存,视图可以从您的viewDidLoad方法中再次完全重新创建。

+0

我可以澄清你的答案,我实例化viewDidload中的locationManager,所以它的权利释放它在viewDidUnload(如果视图被卸载),也有权释放它在dealloc它的应用程序退出视图仍然加载的情况下? – fuzzygoat 2010-06-01 15:29:58

+0

如果你在viewDidLoad中实例化它,那么是,在viewDidUnload中释放它(假设你不想在位图更新之前再次加载视图!)。而你又是对的 - 释放它在dealloc :) – deanWombourne 2010-06-01 15:52:22

+0

谢谢,非常感谢。 – fuzzygoat 2010-06-01 16:23:36

5

viewDidUnload您应该将您的IBOutlet属性设置为零,并且在viewDidLoad中初始化任何东西。

请记住,如果手机内存不足,您的视图将被卸载,如果它不在屏幕上。下次再次加载视图时,新视图将连接到IBOutlets,并且viewDidLoad将再次被调用。因此,您应该在viewDidUnload中将插座属性设置为零以减少内存占用量。

0

这个家伙在做self.object = nil之前正在做[object release]

是第一次发布什么?在Apple文档中,它们仅影响变量的nil ...什么是正确的?

+1

如果你的实例变量被声明为@property(retain),那么你可以简单地使用[self setMyVariable:nil];这将释放旧对象并保留零。在我上面的例子中,我没有使用@property,因此手动发布和nil。 – fuzzygoat 2010-06-07 10:03:24

+0

locationManager = nil不会导致它被释放,因为它直接在伊娃上运行。所以你需要明确地释放它,或者使用mutator([self setLocationManager:nil]或self.locationManager = nil)来释放先前保留的值。我个人更喜欢他的例子中的版本([locationManager release],locationManager = nil),因为它更明确地说明了发生了什么。 – 2011-01-03 22:37:49