2011-12-28 16 views
6

iOS 5の新しいTWRequest APIを使用して、ブロックの使用に関連したレンガの壁にぶつかってきました。Objective-Cのブロック内でブロックを使用する:EXC_BAD_ACCESS

私がしなければならないことは、最初の要求に対して成功した応答を受け取ったときに、すぐに別の要求を起動することです。 2番目のリクエストの完了ブロックで、私はマルチステップ操作の成功または失敗を通知します。

は、ここで私がやっている大まかです:

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

それだけで罰金最初の要求を実行するが、私はハンドラを有する第2 1を起動しようとすると、それがクラッシュします。そのコードの何が間違っていますか?


リクエストを作成するための方法は、のように簡単です:私はTW *に精通していないよので、この野生の推測を検討

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

+0

'-createSecondRequest'のコードを投稿できますか?私は、このコードがバックグラウンドスレッド上で実行されることに問題があると推測しています。これは、完了ハンドラがどのスレッドを実行するかについて決して保証されないからです。 –

+0

完了;申し訳ありませんが、それは関連性があるとは思わなかった。 – biasedbit

答えて

18

TWRequestに署名するために使用しているACAccountを所有するACAccountStoreを保持していることを確認してください。

ACAccountを無効にすると、TWRequestで署名したときにEXC_BAD_ACCESSが表示されます。

+0

ありがとう!しかし、それはちょっと厄介です。 Twitter Requestオブジェクトで設定しないオブジェクトへの参照を保存する必要があります。非常にエラーが発生しやすい。 – HyLian

+0

うわー、それを指摘してくれてありがとう! – cleverbit

+0

これは私の人生を保存しました – vangoz

1

...ヒープに割り当てられたブロックを送信してみてください:

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

明確にするために、私はTW *がそれを保持するかもしれないが、それはすでにSの外に出た場合、それはどんな違いをすることはありませんので、あなたが送っているブロックは、ヒープに割り当てられていると思います対処する。

+0

私はアークを使用しているので、これを使用して私のプロを解決したので、保持はもはや... – GameLoading

関連する問題