使用Class方法与具有委托的对象混淆

时间:2011-07-12 01:55:15

标签: iphone objective-c ios asynchronous delegates

我对代表感到困惑。我一直认为,如果你没有设置委托,那么它就不会响应委托回调。我发布了一个释放其对象的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中,但跟踪跟踪会带我回到我的类方法,它在完成之前释放对象。

这一点的全部意义在于,我很惊讶我在这里发生了撞车事故,而我正试图绕过这个问题。一个同事和我进行了讨论,他说它是因为我正在释放我的对象所以委托指向垃圾。这对我来说似乎不对,因为这个类方法无论如何都没有收到响应?

1 个答案:

答案 0 :(得分:1)

我认为您的问题实际上与不清理ASIHttpRequest委托有关:ASIHttpRequest对象将其委托设置为从该对象调用。

所以你需要清除那个委托(在Something类中)。假设你有一个ASIHttpRequest类型的属性,这是我在dealloc方法中做的:

- (void)dealloc {

...
[_request clearDelegatesAndCancel];
[_request release];
[super dealloc];

... [_request clearDelegatesAndCancel]; [_request release]; [super dealloc];