对代表感到困惑。我一直觉得,如果你没有设置一个委托,而不会响应委托回调。我碰到一个释放它的对象的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中,但跟踪将我带回到我的类方法,该方法在完成之前释放对象。
整个问题的关键在于,我很惊讶我在这里发生了一次撞车事故,并且我正试图围绕这一点进行考虑。一位同事和我参加了一次讨论,他说这是因为我正在释放我的对象,所以委托人指着垃圾。这对我来说似乎是错误的,因为这个类方法不会收到响应呢?
从崩溃的描述听起来像你设置这个“东西”对象上的委托ASIHttpRequest。那是对的吗?如果是这样的话,那么当请求仍然认为“某事”是该请求的委托时,你正在销毁那些东西。 –
Arghh,因为异步连接而输入了全部内容......。 ASIHttpRequest在几天前被其他人的NSURLConnection添加。 – warpedspeed
这个问题不是100%清楚,但我认为你的同事是正确的。你确定''shoutItOutLoud'里面创建的'something'对象在'release'd后没有被使用吗?尝试做'something = nil;'在'[释放]之后'' – nacho4d