Iphone 对使用带有委托的对象的类方法感到困惑
我对代表感到困惑。我一直认为,如果不设置代理,它就不会响应代理回调。我遇到了一个类方法崩溃,该类方法释放了它的对象 假设我有一个对象“Something”,它有一个委托设置,用于向关心的调用方处理结果。有些东西使用ASIHTTPRequest异步执行一些POST/GETIphone 对使用带有委托的对象的类方法感到困惑,iphone,objective-c,ios,asynchronous,delegates,Iphone,Objective C,Ios,Asynchronous,Delegates,我对代表感到困惑。我一直认为,如果不设置代理,它就不会响应代理回调。我遇到了一个类方法崩溃,该类方法释放了它的对象 假设我有一个对象“Something”,它有一个委托设置,用于向关心的调用方处理结果。有些东西使用ASIHTTPRequest异步执行一些POST/GET -(void)somethingHasResults{ //something needs to tell its listeners that its has completed (pseudo-code) if([d
-(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];
}
当我使用[助手大声叫喊]时,我会崩溃。现在崩溃实际上出现在ASIHttpRequest.m的reportFinished中,但是随着跟踪,我会一直回到我的类方法,它在完成之前释放对象
这件事的关键是,我很惊讶我在这里撞车了,我正试图把我的头绕在这件事上。我和一位同事进行了讨论,他说这是因为我正在释放我的对象,所以代表指向垃圾。这对我来说似乎是错误的,因为该类方法无论如何都不会收到响应?我相信您的问题实际上与不清理ASIHttpRequest委托有关:ASIHttpRequest对象将其委托设置为从中调用的对象 因此,您还需要清除该委托(在Something类中)。假设您有一个ASIHttpRequest类型的属性,下面是我在dealloc方法中所做的:
-(无效)解除锁定{
}
我认为您的问题实际上与不清理ASIHttpRequest委托有关:ASIHttpRequest对象将其委托设置为从调用对象的委托
因此,您还需要清除该委托(在Something类中)。假设您有一个ASIHttpRequest类型的属性,下面是我在dealloc方法中所做的:
-(无效)解除锁定{
}
根据对崩溃的描述,您似乎正在将此“某物”对象设置为ASIHttpRequest上的委托。对吗?如果是这样,那么当请求仍然认为“某物”是该请求的委托时,您正在销毁该某物。Arghh,在键入所有这些之后…这是因为异步连接。几天前,其他人添加了一个HttpRequest来代替NSURLConnection。这个问题对我来说不是100%清楚,但我认为你的同事是正确的。您确定在shoutOutloud
中创建的something
对象在release
d后未被使用吗?尝试做something=nil代码>在<代码>[某物发布]代码>@Firoze Lafeer是的,没错。在我把它全部打印出来之后,它才有意义。另外一个SO线程:从崩溃的描述来看,听起来好像您正在将这个“something”对象设置为ASIHttpRequest上的委托。对吗?如果是这样,那么当请求仍然认为“某物”是该请求的委托时,您正在销毁该某物。Arghh,在键入所有这些之后…这是因为异步连接。几天前,其他人添加了一个HttpRequest来代替NSURLConnection。这个问题对我来说不是100%清楚,但我认为你的同事是正确的。您确定在shoutOutloud
中创建的something
对象在release
d后未被使用吗?尝试做something=nil代码>在<代码>[某物发布]代码>@Firoze Lafeer是的,没错。在我把它全部打印出来之后,它才有意义。另一个SO线程:
...
[_request clearDelegatesAndCancel];
[_request release];
[super dealloc];