我有一个数据加载器在完成后向其委托发送消息
- (void) loadingMethod {
// Loading stuff...
[delegate LoaderDidFinish];
}
委托然后重新启动调用它的加载器,然后执行一些操作。
- (void) LoaderDidFinish {
[Loader release];
// Do stuff
}
这导致错误的访问错误。
我认为这是因为在LoaderDidFinish
完成控制后返回到已释放的loadingMethod
。
然而,让我感到满意的是,稍后在方法中释放Loader
解决了这个问题:
- (void) LoaderDidFinish {
// Do stuff
[Loader release]; // Now there is no bad access error!
}
有人可以解释为什么会这样吗?
答案 0 :(得分:2)
// Do stuff
中的某些内容使用Loader
的某些部分。
一般来说,我不确定从其委托中释放对象是否最佳。但如果必须,autorelease
可以避免这个问题。
答案 1 :(得分:2)
通过将呼叫转移到释放状态,您不会遇到任何错误的访问错误,这只是纯粹的运气。
如果你需要在获得回调后释放加载器,它应该在runloop中延迟,例如。通过使用[self performSelector:@selector(deferredLoaderDelete) withObject:nil afterDelay:0.0f]
或通过自动释放回调中的加载程序。