exc_bad_access при использовании асинхронного запроса - PullRequest
0 голосов
/ 04 августа 2011

Я делаю асинхронный запрос, но когда я пытаюсь разобрать его с этим кодом

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {    
[connection release];

NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
[responseData release];

NSDictionary *missionsDict = [responseString JSONValue];

/*NSArray *luckyNumbers = [json objectWithString:responseString error:&error];*/
NSLog(@"user Info array is: %@", missionsDict);
//    NSDictionary *array = [luckyNumbers1 objectForKey:@"data"];
NSDictionary *missionsData;
missionsData = [missionsDict objectForKey:@"data"];
NSLog(@"missionsData is: %@", missionsData);
NSEnumerator *inner = [missionsData objectEnumerator];
UIScrollView *missionsScroll;
missionsScroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
missionsScroll.contentSize = CGSizeMake(320, 1005);
[self.view addSubview:missionsScroll];
id value;
int badgeY1;
int badgeY2;
int badgeY3;
badgeY1 = 121;
badgeY2 = 161;
badgeY3 = 150;
while((value = [inner nextObject])) {
    NSLog(@"progress is: %@", [value objectForKey:@"progress"]);
    NSLog(@"user Info array is: %@", missionsDict);
    NSLog(@"name is: %@",[value objectForKey:@"reward_definitions"]);
    NSLog(@"missionsData is: %@", missionsData);
    NSDictionary *moreData;
    moreData = [value objectForKey:@"reward_definitions"];
    NSEnumerator *inner = [moreData objectEnumerator];
    id value2;
    int badgeX;
    badgeX = 10;
    while((value2 = [inner nextObject])) {
        UIProgressView *progressView;
        progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(0, badgeY3, 372, 9)];
        float progressValue;
        progressValue = ([[[value objectForKey:@"progress"] objectForKey:@"earned"] floatValue] / [[[value objectForKey:@"progress"] objectForKey:@"possible"] floatValue]);
        NSLog(@"progressValue is: %f", progressValue);
        [progressView setProgress:progressValue];
        [missionsScroll addSubview:progressView];
        UILabel *missionName;
        missionName = [[UILabel alloc] initWithFrame:CGRectMake(20, badgeY1, 280, 25)];
        missionName.backgroundColor = [UIColor clearColor];
        missionName.textColor = [UIColor whiteColor];
        missionName.font = [UIFont fontWithName:@"Heiti TC" size:23.0];
        missionName.text = [value objectForKey:@"name"];
        [missionsScroll addSubview:missionName];
        NSLog(@"badgeY2 is: %@", badgeY2);
        badgesScroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, badgeY2, 318, 70)];
        badgesScroll.contentSize = CGSizeMake(320, 70);
        [missionsScroll addSubview:badgesScroll];

        NSLog(@"Image URL is: %@", [value2 objectForKey:@"image_url"]);
        NSURL *url1 = [NSURL URLWithString: [NSString stringWithFormat:@"%@", [value2 objectForKey:@"image_url"]]];            
        NSData *urlData1 = [NSData dataWithContentsOfURL:url1];
        UIImage *image1 = [UIImage imageWithData:urlData1];
        UIImageView *badge = [[UIImageView alloc] initWithImage:image1];
        [badge setFrame:CGRectMake(badgeX, -10, 70, 70)];               
        [badgesScroll addSubview:badge];
        [badge release];
        badgeCount = badgeCount+1;
        badgeX = badgeX +80;
    }
    // NSLog(@"reward_definitions is: %@", [missionsData objectForKey:@"id"]);
    //       NSLog(@"Image URL is: %@", [[value objectForKey:@"reward_definitions"] objectForKey:@"image_url"]);
    //if ( [array isKindOfClass:[NSDictionary class]] ) {
    badgeY1 = badgeY1 +100;
    badgeY2 = badgeY2 +100;
    badgeY3 = badgeY3 +100;
    missionCount = missionCount+1; 
}
for (int b; badgeCount > 4; b = b+1) {
    [badgesScroll setContentSize:CGSizeMake(badgesScroll.contentSize.width+80, badgesScroll.contentSize.height)];
}
for (int a; missionCount > 4; a = a+1) {
    missionsScroll.contentSize = CGSizeMake(776, missionsScroll.contentSize.height+200);
}

}

Сбой из-за EXC_BAD_ACCESS на NSLog(@"badgeY2 is: %@", badgeY2);

Ответы [ 2 ]

2 голосов
/ 04 августа 2011

ваш badgeY2 содержит целочисленное значение. Чтобы напечатать целочисленное значение с NSLog, вы должны использовать% d При использовании NSLog вы всегда должны помнить, какое значение оно возвращает!

NSLog(@"badgeY2 is: %d", badgeY2);

Есть еще одно чертово решение, чтобы просто сообщить

NSLog(@"%@", [NSNumber numberWithInt:badgeY2]);

Это спецификаторы формата NSLog:

%@     Object    
%d, %i signed int
%u     unsigned int
%f     float/double

%x, %X hexadecimal int
%o     octal int
%zu    size_t
%p     pointer
1 голос
/ 04 августа 2011

Должно быть

 NSLog(@"badgeY2 is: %i", badgeY2);

badgeY2 является целым числом, поэтому вы должны использовать% i вместо% @

...