2011-09-30 35 views
0

我做了一個構建和分析,並被警告存儲在'locationManager'中的對象的潛在泄漏。我想知道如何正確處理這個問題。下面的代碼:如何處理對象警告的潛在泄漏 - CLLocationManager

//指南針代碼

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

在第一線,你alloc外景經理。這意味着你擁有該參考,並且當你完成時你應該釋放它。

您需要可以釋放位置管理器,當您完成設置它:

// ... 
locationManager.headingFilter = 2; // 2 degrees 
[locationManager release]; 

或者自動釋放它在同一行上你的Alloc它:

CLLocationManager *locationManager = [[[CLLocationManager alloc] init] autorelease]; 

說了這麼多,你應該將位置管理器存儲在實例變量中,以便在某個時刻停止位置更新。否則self可能會被取消分配,位置管理器將繼續向該釋放對象發送消息。這會導致崩潰。

使一個實例變量之後,你的dealloc也許應該有這樣的:

- (void)dealloc 
{ 
    // ... 
    locationManager.delegate = nil; 
    [locationManager stopUpdatingLocation]; 
    [locationManager release]; 
    // ... 
    [super dealloc]; 
} 

清除代表將確保一旦我們已釋放外景經理將不能發送信息給我們。然後我們停止位置更新並釋放實例變量,因爲我們不再需要它。

0

有時手動釋放變量可能有風險。我們不知道在哪裏發佈變量。爲避免釋放變量的人工工作,我們可以做的一件事是點擊Build setting中的項目搜索自動引用計數,將其值設置爲「YES」。通過將該值設置爲「YES」,不需要手動釋放變量。