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