0

さて、私はjsonからデータを解析しており、それらを動的に配列に追加しています。それらのデータを12個追加すればOKです。しかし、13番目を追加しようとすると、このエラーが発生します(13番目が何であっても):

EXC_BAD_ACCESS

これが私のコードです:

HomeView.h

#import <UIKit/UIKit.h>

@interface HomeView : UIViewController{  
    NSMutableData *responseData;
}

@property (nonatomic, strong) NSMutableData *responseData;

@end

そして私の実装ファイル:

@implementation HomeView
@synthesize responseData;

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSLog(@"connectionDidFinishLoading");
NSLog(@"Succeeded! Received %d bytes of data",[self.responseData length]);

// convert to JSON
NSError *myError = nil;
NSDictionary *res = [NSJSONSerialization JSONObjectWithData:self.responseData options:NSJSONReadingMutableLeaves error:&myError];
    NSString *parsed_track=[res objectForKey:@"data1"];
    [tracks_condition addObject:parsed_track];
    parsed_track=[res objectForKey:@"data2"];
    [tracks_condition addObject:parsed_track];
    parsed_track=[res objectForKey:@"data3"];
    [tracks_condition addObject:parsed_track];
    parsed_track=[res objectForKey:@"data4"];
    [tracks_condition addObject:parsed_track];
    parsed_track=[res objectForKey:@"data5"];
    [tracks_condition addObject:parsed_track];
    parsed_track=[res objectForKey:@"data6"];
    [tracks_condition addObject:parsed_track];

   parsed_track=[res objectForKey:@"data7"];
    [tracks_condition addObject:parsed_track];
    parsed_track=[res objectForKey:@"data8"];
    [tracks_condition addObject:parsed_track];
    parsed_track=[res objectForKey:@"data9"];
    [tracks_condition addObject:parsed_track];
    parsed_track=[res objectForKey:@"data10"];
    [tracks_condition addObject:parsed_track];
    parsed_track=[res objectForKey:@"data11"];
    [tracks_condition addObject:parsed_track];
    parsed_track=[res objectForKey:@"data12"];
    [tracks_condition addObject:parsed_track];

  // parsed_track=[res objectForKey:@"data13"]; //HERE COMES THE ERROR
   // [tracks_condition addObject:parsed_track];

}

メモリ管理の何かだと思いますが、何がわかりません。

4

2 に答える 2

2

@"data13"おそらくこのキーは存在せず、 を返しますnil。その場合nil、追加するかどうかを確認して決定する必要があります。追加したい場合は[NSNull null]、継承するオブジェクトを使用する必要があるため、代わりに追加してくださいNSObject

編集:forループでも作成して、文字列を作成してみてください[NSString stringWithFormat.....]

于 2012-08-26T11:41:02.580 に答える
1

EXC_BAD_ACCESS は、nilオブジェクトを配列に追加しようとしているか、オブジェクトを配列に追加するまでにオブジェクトが既に解放されているためです。

別の注意として、多くのコード行ではなく、オブジェクトを配列に追加するために for ループを使用できます。

for (NSUInteger idx = 1; idx <= [[res allKeys] count]; idx++) {

    if ([[[res allKeys] objectAtIndex:idx] rangeOfString:@"data"].location != NSNotFound)
        [tracks_condition addObject:[res objectForKey:[NSString stringWithFormat:@"data%d", idx]]];

}

またはさらに良い:

[self.questionInfo enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {

        if ([key rangeOfString:@"data"].location != NSNotFound && obj != nil) {

            [tracks_condition addObject:obj];

        }

        else {

            if ([tracks_condition count] >= 18) {
                *stop = YES;

            }                   
        }

}];
于 2012-08-26T12:17:17.757 に答える