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



我做了一个构建和分析,并被警告关于存储在'locationManager'中的对象的潜在泄漏。我在想这件事该怎么处理才好。下面是代码:

//Compass Code

    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");
    }

感谢您的帮助

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

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

有时手动释放变量可能有风险。我们不知道在哪里释放变量。为了避免手动释放变量,我们可以做的一件事是在Build设置中单击项目,搜索自动引用计数,将其值设置为"YES"。通过将值设置为"YES",无需手动释放变量

最新更新