2

私はこのTwitter APIのものを試してきましたが、本当に混乱しています...

次のコードで EXC_BAD_ACCESS の不正なアクセスが発生し続けます...ここで何が問題なのですか?

NSURL *followingURL = [NSURL URLWithString:@"https://api.twitter.com/1/users/lookup.json"];
// Pass in the parameters (basically '.ids.json?screen_name=[screen_name]')
id fromIntToNum = [NSNumber numberWithInteger: friID];
NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:@"159462573", @"user_id", nil];
// Setup the request
twitterRequest = [[TWRequest alloc] initWithURL:followingURL
                                                parameters:parameters
                                             requestMethod:TWRequestMethodGET];
// This is important! Set the account for the request so we can do an authenticated request. Without this you cannot get the followers for private accounts and Twitter may also return an error if you're doing too many requests
[twitterRequest setAccount:theAccount];
// Perform the request for Twitter friends
[twitterRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
    if (error) {
        /*
        // deal with any errors - keep in mind, though you may receive a valid response that contains an error, so you may want to look at the response and ensure no 'error:' key is present in the dictionary
        NSLog(@"%@",error);*/
    } else {
        /*NSError *jsonError = nil;
        // Convert the response into a dictionary
        NSDictionary *twitterGrabbedUserInfo = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONWritingPrettyPrinted error:&jsonError];
        // Grab the Ids that Twitter returned and add them to the dictionary we created earlier
        NSLog(@"%@", [twitterGrabbedUserInfo objectForKey:@"screen_name"]);*/
    }

}];

コードが失敗する行を区切りました...

この Twitter API の問題の原因は何ですか?

次の行はクラッシュを引き起こします:::

[twitterRequest performRequestWithHandler:^(NSData *responseData,
                NSHTTPURLResponse *urlResponse, NSError *error) {

また、時々このエラーが発生します:

[__NSCFNumber credentialForAccount:]: unrecognized 

更新: ハンドラーをコメントアウトし、TwitterRequest と ivar を作成しましたが、それでもクラッシュします...

4

2 に答える 2

2

ブロックでエラーを探しますが、エラーが発生した場合はログに記録して続行します。「else」ステートメントを入れて、エラーがない場合にのみ続行する必要があります。

ハンドラー内のすべてのコードをコメントアウトして、何もしないでください。クラッシュが発生するかどうかを確認してください。次に、エラーコードだけで試してください。次に、JSON シリアライゼーションを試し、最後に最後の行を試します。問題を引き起こしているブロックの部分を見つけることができれば、それが助けになります。

また、 performRequestWithHandler: はブロックしないと思われますが、ブロック内でリクエストが完了したことをクラスに通知することを期待しています。その場合、「TWRequest *twitterRequest」は ivar またはプロパティである必要があり、ハンドラーが完了したときに何らかのメソッドが呼び出されるようにする必要があることを意味します。クラッシュは、オブジェクトの実行中に ARC がオブジェクトを再割り当てしたことが原因である可能性があります。

編集: TWRequest クラスの説明に次のように記載されていることに注意してください:「initWithURL:parameters:requestMethod: メソッドを使用して、必要なプロパティ値を渡す新しく作成された TWRequest オブジェクトを初期化します。」それは複数のプロパティを意味します。 「credentialForAccount」プロパティも必要ですか? 必要なすべてのプロパティを見つけるには、twitter ドキュメントを読む必要があります。

EDIT2: ええと、ハンドラーまで到達したかどうかさえわかりません。そこに NSLog を配置しますが、そこまで到達することはないと思います。true の場合、これは 3 つの可能性を残します。

a)URLが気に入らない(これは良いようですが)

b)期待されるいくつかのパラメータがありません

c) id は「theAccount」オブジェクトを好みません - それは有効な ACAccount オブジェクトですか? NSLogging を試してください。

この3つのうちのどれかでなければなりません。

于 2012-07-24T14:50:18.693 に答える
1

私は iOS5 と TWRequest で同様の問題を抱えていましたが、リクエスト ハンドラ ブロックが呼び出される前に ACAccountStore が解放されることが問題であることが判明しました。次のコードはこれを修正しました:

__weak ACAccountStore *wAccountStore = accountStore;
[request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
    __strong ACAccountStore *sAccountStore = wAccountStore;

    // handle the finished request here

    // to silence Xcode warning 'unused variable'
    // not necessary for releasing sAccountStore, 
    // it will go out of scope anyway when the block ends
    sAccountStore = nil;
}];

このようにして、accountStore はブロックが終了するまで保持されます。

于 2013-02-07T09:00:24.943 に答える