Я пытаюсь выяснить, что рекомендуется для следующей ситуации. Некоторые объекты, такие как 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
Мне интересно, считается ли этот шаблон использования всегда в порядке, если он считается неактивным или это зависит от класса?
Существует очевидный случай, когда выпуск делегирующего объекта будет ошибочным, и если это необходимо, после того, как он уведомил делегата. Если делегат освобождает объект, его память может быть перезаписана и приложение сработает. (Кажется, что происходит в моем приложении с CLLocationManager в определенном обстоятельстве, как на симуляторе. Я пытаюсь выяснить, является ли это ошибкой симулятора, или если то, что я делаю, в корне ошибочно.)
Я искал, и я не могу найти окончательного ответа на этот вопрос. Кто-нибудь имеет авторитетный источник, который может ответить на этот вопрос?