【问题标题】:How to handle potential leak of an object warning - CLLocationManager如何处理对象警告的潜在泄漏 - CLLocationManager
【发布时间】:2011-09-30 10:11:17
【问题描述】:
我进行了构建和分析,并收到有关存储在“locationManager”中的对象可能泄漏的警告。我想知道这应该如何正确处理。代码如下:
// 罗盘代码
CLLocationManager *locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
if ([CLLocationManager locationServicesEnabled] &&
[CLLocationManager headingAvailable]) {
[locationManager startUpdatingLocation];
[locationManager startUpdatingHeading];
locationManager.headingFilter = 2; // 2 degrees
} else {
NSLog(@"Can't report heading");
}
感谢您的帮助
【问题讨论】:
标签:
iphone
ios
memory-management
core-location
【解决方案1】:
在第一行您alloc 位置经理。这意味着您拥有该引用,并且您应该在完成后释放它。
您需要在完成设置后释放位置管理器:
// ...
locationManager.headingFilter = 2; // 2 degrees
[locationManager release];
或者在你分配它的同一行自动释放它:
CLLocationManager *locationManager = [[[CLLocationManager alloc] init] autorelease];
话虽如此,您可能应该将位置管理器存储在实例变量中,以便您可以在某个时候停止位置更新。否则self 可能会被释放,并且位置管理器将继续向该释放对象发送消息。这会导致崩溃。
创建一个实例变量后,你的 dealloc 应该是这样的:
- (void)dealloc
{
// ...
locationManager.delegate = nil;
[locationManager stopUpdatingLocation];
[locationManager release];
// ...
[super dealloc];
}
清除委托将确保位置管理器在我们被解除分配后不会向我们发送任何消息。然后我们停止位置更新并释放实例变量,因为我们不再需要它。
【解决方案2】:
有时手动释放变量可能会有风险。我们不知道究竟在哪里释放变量。为了避免释放变量的手动工作,我们可以做的一件事是在构建设置中单击项目搜索自动引用计数,将其值设置为“YES”。通过将值设置为“YES”,无需手动释放变量。