我对代表感到困惑。我一直认为,如果你没有设置委托,那么它就不会响应委托回调。我发布了一个释放其对象的Class方法崩溃。
假设我有一个对象“Something”,它有一个委托设置,用于处理关心的调用者的结果。有些东西使用ASIHTTPRequest做一些post / gets异步。
-(void)somethingHasResults{
//something needs to tell its listeners that its has completed (pseudo-code)
if([delegate respondsToSelector:@selector(somethingDidComplete)]){
[delegate somethingDidComplete];
}
}
但我也有一个Helpers.h / .m,有一系列类方法,如此......
+(void)shoutItOutLoud{
//doesn't need a delegate, doesn't need a response -- just do your thing and exit
Something *something = [[Something alloc] init];
[something shouldDoSomethingAwesomeButDoesntNeedToRespond];
[something release];
}
当我使用[Helpers shoutItOutLoud]时,我遇到了崩溃。现在崩溃实际上是在ASIHttpRequest.m的reportFinished中,但跟踪跟踪会带我回到我的类方法,它在完成之前释放对象。
这一点的全部意义在于,我很惊讶我在这里发生了撞车事故,而我正试图绕过这个问题。一个同事和我进行了讨论,他说它是因为我正在释放我的对象所以委托指向垃圾。这对我来说似乎不对,因为这个类方法无论如何都没有收到响应?
答案 0 :(得分:1)
我认为您的问题实际上与不清理ASIHttpRequest委托有关:ASIHttpRequest对象将其委托设置为从该对象调用。
所以你需要清除那个委托(在Something类中)。假设你有一个ASIHttpRequest类型的属性,这是我在dealloc方法中做的:
- (void)dealloc {
...
[_request clearDelegatesAndCancel];
[_request release];
[super dealloc];
...
[_request clearDelegatesAndCancel];
[_request release];
[super dealloc];