1

我有一个单独的类我想处理来自ASIHTTPRequest的响应,所以我创建了一个类的实例,然后将它传递给我的请求。问题是我的委托类在请求结束之前被释放。didFinishSelector的自定义委托类ASIHTTPRequest被释放之前被称为

我正在使用ARC。我如何确保代表保留为didFinish/didFail选择器?

-(void)getStuff 
{ 
    NSURL *url = [NSURL URLWithString:@"http://example.com/json"]; 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 

    UpdateFeedDelegate *updateFeedDelegate = [[UpdateFeedDelegate alloc] init]; 

    [request setDelegate:updateFeedDelegate]; 
    [request setDidFinishSelector:@selector(updateTestDone:)]; 
    [request setDidFailSelector:@selector(getSingleUpdateFeedBackgroundRequestFailed:)]; 

    [request startAsynchronous]; 
} 

在此示例中,选择器类按预期方式存在。我得到的错误:

*** -[UpdateFeedDelegate respondsToSelector:]: message sent to deallocated instance 0x56efb50

*** NSInvocation: warning: object 0x56efb50 of class '_NSZombie_UpdateFeedDelegate' does not implement methodSignatureForSelector: -- trouble ahead

*** NSInvocation: warning: object 0x56efb50 of class '_NSZombie_UpdateFeedDelegate' does not implement doesNotRecognizeSelector: -- abort

回答

2

代表通常由weakassign性质举行。您需要在某个地方持有strongretain对您的UpdateFeedDelegate的引用,以便它不会被自动发布。通常,我在创建请求和委托的类中保存这个。

+1

谢谢。因为我一次可能有很多请求,并且我需要为每个请求使用一个新的委托对象,并且据我了解,默认情况下,所有实例变量和局部变量都是强指针,我仍然不确定如何实现此目的。我不能使用强大的财产,因为我不知道我需要多少财产。 – 2012-08-03 15:31:34

+1

在这种情况下使用“NSMutableArray”或“NSMutableDictionary”,它们对其成员拥有强烈的引用 – 2012-08-03 15:35:25

+0

完美。谢谢。 – 2012-08-03 15:43:25

相关问题