2011-12-28 62 views
6

使用iOS 5的新TWRequest API,我遇到了与块使用相关的砖墙。在Objective-C的块中使用块:EXC_BAD_ACCESS

我需要做的是在收到第一个请求的成功响应后立即激发另一个请求。然后,在第二个请求的完成块中,通知多步操作的成功或失败。

这里大概我在做什么:

- (void)doRequests 
{ 
    TWRequest* firstRequest = [self createFirstRequest]; 
    [firstRequest performRequestWithHandler:^(NSData* responseData, 
               NSHTTPURLResponse* response, 
               NSError* error) { 
     // Error handling hidden for the sake of brevity... 
     TWRequest* secondRequest = [self createSecondRequest]; 
     [secondRequest performRequestWithHandler:^(NSData* a, 
                NSHTTPURLResponse* b, 
                NSError* c) { 
      // Notify of success or failure - never reaches this far 
     }]; 
    }]; 
} 

我不保留任何请求或保持对其引用的任何地方;它只是失火而已。

然而,当我运行的应用程序,它与EXC_BAD_ACCESS崩溃上:

[secondRequest performRequestWithHandler:...]; 

它执行的第一个请求就好了,但是当我尝试推出与处理程序的第二个,它崩溃。该代码有什么问题?

- (TWRequest*)createFirstRequest 
{ 
    NSString* target = @"https://api.twitter.com/1/statuses/home_timeline.json"; 
    NSURL* url   = [NSURL URLWithString:target]; 
    TWRequest* request = [[TWRequest alloc] 
          initWithURL:url parameters:params 
          requestMethod:TWRequestMethodGET]; 
    // _twitterAccount is the backing ivar for property 'twitterAccount', 
    // a strong & nonatomic property of type ACAccount* 
    request.account = _twitterAccount; 

    return request; 
} 
+0

请发布'createFirstRequest'和'createSecondRequest'的代码 – vikingosegundo 2011-12-28 22:53:13

+0

您可以发布'-createSecondRequest'的代码吗?我猜这个代码在后台线程上运行有问题,因为从来没有保证完成处理程序将运行在哪个线程上。 – 2011-12-28 22:54:27

+0

完成;对不起'回合,并不认为这是相关的。 – biasedbit 2011-12-28 23:00:36

回答

18

确保您保留参考/保留ACAccountStore拥有ACAccount您用于签署TWRequest s。

如果您不这样做,ACAccount将会失效,然后在尝试触发与其签名的TWRequest时,您将获得EXC_BAD_ACCESS。

+0

谢谢!但感觉有点尴尬。您需要保存对您不打算在Twitter请求对象中设置的对象的引用。非常容易出错。 – HyLian 2012-08-04 22:03:58

+0

哇,谢谢指出! – cleverbit 2012-09-15 18:39:06

+0

这救了我的生命 – vangoz 2013-06-03 07:53:51

1

我不熟悉TW *,所以认为这是一个胡乱猜测......尝试发送一个堆分配块:


创建请求是那样简单的方法:

[firstRequest performRequestWithHandler:[^ (NSData *responseData, ...) { 
    ... 
} copy]]; 

为了澄清,我认为你发送的块是堆分配,因此,虽然TW *可能会保留它,它不会使任何区别,如果它已经出去了S的应付。

+0

我解决了我的专业使用这个,因为我使用弧,所以保留是没有更多... – GameLoading 2012-09-12 10:33:16