我想弄清楚以下情況的推薦做法。某些對象(如CLLocationManager或MKReverseGeocoder)將其結果異步發送給委託回調方法。在回調方法中釋放CLLocationManager或MKReverseGeocoder實例(或者其他類)可以嗎?重點是你不再需要這個對象,所以你告訴它停止發送更新,將它的委託設置爲零,並釋放對象。在其委託回調方法中釋放委託對象
僞代碼:
@interface SomeClass <CLLocationManagerDelegate>
...
@end
@implementation SomeClass
...
- (void)someMethod
{
CLLocationManager* locManager = [[CLLocationManager alloc] init];
locManager.delegate = self;
[locManager startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
// Do something with the location
// ...
[manager stopUpdatingLocation];
manager.delegate = nil;
[manager release];
}
@end
我想知道如果這個使用模式被認爲是永遠OK,如果它被認爲是永遠OK,或者如果它取決於類?
有一個明顯的情況,即釋放委託對象會出錯,也就是說,如果它在通知委託後需要做些什麼。如果代理釋放該對象,則其內存可能會被覆蓋並且應用程序崩潰。 (這似乎是在我的應用程序與CLLocationManager在特定情況下發生了什麼,兩者都只在模擬器上,我試圖弄清楚它是模擬器錯誤,還是我所做的是從根本上有缺陷。)
我一直在尋找,我無法找到一個確鑿的答案。有沒有人有權回答這個問題的權威來源?
如果你看到崩潰 - 你可以嘗試的另一件事是將它設置爲* autorelease *而不是明確地釋放它。雖然,不確定地知道,這可能只是混淆問題,而不是修復它的真實... – Brad 2010-10-31 19:33:19
有趣的是,我沒有考慮到這一點。不過,我不知道哪個autorelease池會選擇它。 – Hollance 2010-10-31 21:07:17
我不確定,但不知怎的,這樣做感覺不對。 – 2010-10-31 21:50:26