Освобождение делегирующего объекта в его делегате метод обратного вызова

Я пытаюсь понять, что рекомендуется делать в следующей ситуации. Некоторые объекты, такие как 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 в определенных обстоятельствах, и то и другое только на симуляторе. Я ' я пытаюсь выяснить, является ли это ошибкой симулятора или то, что я делаю, имеет фундаментальные недостатки.)

Я искал и не могу найти окончательного ответа на этот вопрос. Есть ли у кого-нибудь авторитетный источник, который может ответить на этот вопрос?

17
задан Hollance 31 October 2010 в 19:00
поделиться