2011-07-12 42 views
1

对代表感到困惑。我一直觉得,如果你没有设置一个委托,而不会响应委托回调。我碰到一个释放它的对象的Class方法。将Class方法与具有委托的对象混淆

可以说我有一个对象“某事”,它有一个委托设置,用于处理关心的调用者的结果。有些东西使用ASIHTTPRequest来做一些帖子/异步获取。

-(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]; 

} 

当我使用[助手shoutItOutLoud]我得到一个崩溃。现在崩溃实际上是在ASIHttpRequest.m的reportFinished中,但跟踪将我带回到我的类方法,该方法在完成之前释放对象。

整个问题的关键在于,我很惊讶我在这里发生了一次撞车事故,并且我正试图围绕这一点进行考虑。一位同事和我参加了一次讨论,他说这是因为我正在释放我的对象,所以委托人指着垃圾。这对我来说似乎是错误的,因为这个类方法不会收到响应呢?

+0

从崩溃的描述听起来像你设置这个“东西”对象上的委托ASIHttpRequest。那是对的吗?如果是这样的话,那么当请求仍然认为“某事”是该请求的委托时,你正在销毁那些东西。 –

+0

Arghh,因为异步连接而输入了全部内容......。 ASIHttpRequest在几天前被其他人的NSURLConnection添加。 – warpedspeed

+0

这个问题不是100%清楚,但我认为你的同事是正确的。你确定''shoutItOutLoud'里面创建的'something'对象在'release'd后没有被使用吗?尝试做'something = nil;'在'[释放]之后'' – nacho4d

回答

1

我相信你的问题实际上是不清理ASIHttpRequest委托:ASIHttpRequest对象将其委托设置为从中调用的对象。

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

- (void)dealloc {

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

}