2011-12-28 61 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