2010-06-11 51 views
0

我有一个数据加载器将消息发送到其委托时,其完成iPhone目标C:我有解决的问题,但我不知道为什么它的工作

- (void) loadingMethod { 
    // Loading stuff... 
    [delegate LoaderDidFinish]; 
} 

然后委托relases调用它的装载机,然后做一些东西。

- (void) LoaderDidFinish { 
    [Loader release]; 
    // Do stuff 
} 

这导致了一个错误的acces错误。

我认为这是因为LoaderDidFinish完成控制后返回到已发布的loadingMethod

但是什么suppried我是一个事实,即释放Loader后来在方法解决了这一问题:

- (void) LoaderDidFinish { 
    // Do stuff 
    [Loader release]; // Now there is no bad access error! 
} 

有人能解释为什么这个工作?

回答

2

通过将呼叫转移到发布版,您不会遇到任何错误的访问错误,这只是纯粹的运气。

如果您需要在获取回调后释放加载器,则应该在runloop中将其延迟,例如。通过使用[self performSelector:@selector(deferredLoaderDelete) withObject:nil afterDelay:0.0f]或在回调中自动释放加载器。

+0

不幸的是autorelease并没有缝合工作,我想是因为加载器本身使用异步调用。尽管看起来有点冒险,但我认为不适合添加'relaese延迟'解决方案。 – Robert 2010-06-11 12:26:49

+0

如果autorelease不起作用,但最终会释放,你做错了什么。 – 2010-06-11 20:12:15

2

// Do stuff中的某些东西使用Loader的某些部分。

一般来说,我不确定从它的委托中释放一个对象是最佳的。但是,如果你必须,autorelease可以避免这个问题。

相关问题