如何处理对象警告的潜在泄漏--CLLocationManager

时间:2011-09-30 10:11:17

标签: iphone ios memory-management core-location

我做了一个构建和分析,并被警告存储在'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");

    }

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

在第一行,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];
}

清除代表将确保位置管理员在我们取消分配后不会向我们发送任何消息。然后我们停止位置更新并释放实例变量,因为我们不再需要它。

答案 1 :(得分:0)

有时手动释放变量可能会有风险。我们不知道确切地释放变量的位置。我们可以做的一件事就是避免手动释放变量的工作是单击Build设置中的项目搜索自动引用计数将其值设置为“YES”。通过将值设置为“YES”,无需手动释放变量。