6

iOS 5 の新しいTWRequestAPI を使用して、ブロックの使用に関連するレンガの壁に遭遇しました。

私がしなければならないことは、最初のリクエストに対して成功したレスポンスを受け取ったら、すぐに別のリクエストを開始することです。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 番目のリクエストを起動しようとすると、クラッシュします。そのコードの何が問題になっていますか?


リクエストを作成する方法は次のように簡単です。

- (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;
}
4

2 に答える 2

18

sに署名するために使用しているACAccountStoreを所有する参照を保持/保持していることを確認してください。ACAccountTWRequest

そうしないと、は無効になり、署名されたACAccountを起動しようとすると EXC_BAD_ACCESS が返されます。TWRequest

于 2012-01-03T18:38:45.967 に答える
1

私は TW* に詳しくないので、これは大げさな推測だと考えてください。ヒープ割り当てブロックを送信してみてください。

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

明確にするために、送信しているブロックはヒープに割り当てられていると思うので、TW * がそれを保持している可能性がありますが、既に範囲外になっている場合は何の違いもありません。

于 2011-12-31T05:00:28.490 に答える