0

私は私を夢中にさせているバグがあります。NSArray呼ばれる質問があります。配列にはJSON応答が入力されています。これを使用してテーブルビューにデータを入力しようとしています。

ヘッダーファイルで、このような質問を定義しています

@interface OneViewController : UITableViewController <MBProgressHUDDelegate> {
    NSArray *questions;
    MBProgressHUD *HUD;
}

@property (nonatomic, strong) NSArray *questions;

そして私の実装では、このようにインスタンス化しています

@synthesize questions;

ビューが読み込まれると、JSONサービスにpingを実行するこの関数を呼び出しています

- (void) pullQuestions {
    NSMutableDictionary *viewParams = [NSMutableDictionary new];
    [viewParams setValue:@"questions" forKey:@"view"];
    [PythonView viewGet:viewParams success:^(AFHTTPRequestOperation *operation, id responseObject) {
        questions = responseObject;
        NSLog(@"Qestions: %@", responseObject);
        [self.tableView reloadData];
        [HUD hide:YES];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        //ALog(@"Failure: %@", [error localizedDescription]);
    }];
}

応答を受け取ったら、応答オブジェクトをトレースします。これは、適切にフォーマットされたJSON応答です。

  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"VideoFeedCell";
        NSInteger count = [questions count];
        NSLog(@"Count: %i", count);
        for (int i = 0; i < count; i++) {
            NSString* body = [questions objectAtIndex:i];
            NSLog(@"Object: %@", body);
        }
    if (cell == nil) {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"VideoFeedCell" owner:self options:nil];
        // Grab a pointer to the first object (presumably the custom cell, as that's all the XIB should contain).
        cell = [topLevelObjects objectAtIndex:0];   
    }
    return cell;
}

したがって、これをループすると、質問数は4になり、配列の最初のオブジェクトがトレースされます(nullとして)。2回目にforループを実行しようとすると、が取得されますEXC_BAD_ACCESS。質問の配列が消えたようなものです。最も奇妙な点は、別のプロジェクトでほぼ同じコードを使用していて、正常に機能することです。他のプロジェクトで使用したのと同じJSONサービスでテストしましたが(不正な形式などではないことがわかります)、それでもこのエラーが発生します。配列としてのJSON応答、または配列自体が解放されているという奇妙なもの。

4

2 に答える 2

0

ARCを使用していないと仮定すると、問題は、プロパティを介してではなくresponseObject、インスタンス変数に直接割り当てていることだと思います。questionsこれは、の所有権を取得しておらずresponseObject、自動解放プールがフラッシュされたときに解放されることを意味します。

変更してみてください:

questions = responseObject;

に:

questions = [responseObject retain];

また:

self.questions = responseObject;

それで問題が解決するかどうかを確認します。

于 2013-01-31T15:16:02.807 に答える
0

問題はARCに関連していました。私はいくつかの古いボイラープレートコード(しばらく前に構築したタブ付きナビゲーションプロジェクト)から始めました。そしてそれを改造しようとしました。私は、1つのプロジェクトがARCと戦っていて、1つのプロジェクトがそうではなかったという事実に注意を払いませんでした。

于 2013-01-31T15:18:16.683 に答える