我想弄清楚以下情况的推荐做法。某些对象(如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