内存管理& viewDidUnload?

时间:2010-06-01 14:33:14

标签: iphone objective-c cocoa-touch

如果我有一个viewController设置如下:

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

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

在内存管理方面,我应该向viewDidUnload&amp;添加发布。的dealloc?

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


-(void)dealloc {
    [locationManager release];
    [super dealloc];
}
欢呼加里

编辑:

根据Deans的评论,

[super dealloc]降到了最低点。

3 个答案:

答案 0 :(得分:6)

简答:

除非您在viewDidLoad(或xib)中创建/保留它,否则不要在viewDidUnload中释放它。

答案很长:

viewDidUnload用于释放在创建视图时可能发生的任何事情 - 这包括viewDidLoad中的内容,但也包括从xib文件内部创建的IBOutlet属性。这些都应该被释放并在viewDidUnload中设置为nil。

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

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

答案 1 :(得分:5)

viewDidUnload中,您应该将您的IBOutlet属性设置为nil以及在viewDidLoad中初始化的任何内容。

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

答案 2 :(得分:0)

这个人在做self.object = nil;

之前正在做[对象释放]

第一个版本什么都没有?在Apple文档中,它们只会影响变量的nil ...什么是对的?