Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 对使用带有委托的对象的类方法感到困惑_Iphone_Objective C_Ios_Asynchronous_Delegates - Fatal编程技术网

Iphone 对使用带有委托的对象的类方法感到困惑

Iphone 对使用带有委托的对象的类方法感到困惑,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

我对代表感到困惑。我一直认为,如果不设置代理,它就不会响应代理回调。我遇到了一个类方法崩溃,该类方法释放了它的对象

假设我有一个对象“Something”,它有一个委托设置,用于向关心的调用方处理结果。有些东西使用ASIHTTPRequest异步执行一些POST/GET

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