[responseData setLength:0] 崩溃;

发布于 2024-11-27 22:12:56 字数 5945 浏览 1 评论 0原文

我正在发出异步请求,并且在 [responseData setLength:0]; 上收到 EXC_BAD_ACCESS

代码是:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    [responseData setLength:0];
}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [responseData appendData:data];
}

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"Connection failed: %@", [error description]);
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    [responseData release];

    luckyNumbers1 = [responseString JSONValue];

    NSUserDefaults *information = [NSUserDefaults standardUserDefaults];
    /*NSArray *luckyNumbers = [json objectWithString:responseString error:&error];*/
    NSLog(@"luckyNumbers1: %@", luckyNumbers1);
    NSLog(@"user Info array is: %@", luckyNumbers1);
    // [information setObject:[NSString stringWithFormat:@"%@", (NSString *)[luckyNumbers1 objectForKey:@"session"]] forKey:@"sessionID"];
    NSDictionary *array = (NSDictionary *)[luckyNumbers1 objectForKey:@"data"];
    NSEnumerator *inner = [luckyNumbers1 objectEnumerator];
    id value;
    while((value = [inner nextObject])) {
        NSLog(@"user Info array is: %@", value);
        if ( [value isKindOfClass:[NSDictionary class]] ) {
            [information setObject:[value objectForKey:@"id"] forKey:@"userID"];
            NSLog(@"uid is: %@", [value objectForKey:@"id"]);
            [information setObject:[NSString stringWithFormat:@"%@", (NSString *)[value objectForKey:@"points_all"]] forKey:@"pointString"];
            [information setObject:[NSString stringWithFormat:@"%@", (NSString *)[[[value objectForKey:@"leaderboards"] objectForKey:@"all"] objectForKey:@"position"]] forKey:@"rankString"];
            if ((NSNull *)[value objectForKey:@"display_name"] == [NSNull null]) {
                [information setObject:@"No Display Name" forKey:@"displayNameString"];
            } else {
                [information setObject:[NSString stringWithFormat:@"%@", (NSString *)[value objectForKey:@"display_name"]] forKey:@"displayNameString"];
            }
            if ((NSNull *)[value objectForKey:@"level"] == [NSNull null]) {} else {
                [information setObject:[NSString stringWithFormat:@"%@", (NSString *)[[[value objectForKey:@"level"] objectForKey:@"definition"] objectForKey:@"name"]] forKey:@"levelString"];
            }
            pointsTV = [[UILabel alloc] initWithFrame:CGRectMake(222, 294, 441, 22)];
            pointsTV.text = [NSString stringWithFormat:@"Points: %@", [information stringForKey:@"pointString"]];
            pointsTV.backgroundColor = [UIColor clearColor];
            pointsTV.textColor = [UIColor whiteColor];
            [TVWindow addSubview:pointsTV];

            rankLabelTV = [[UILabel alloc] initWithFrame:CGRectMake(222, 269, 441, 22)];
            rankLabelTV.backgroundColor = [UIColor clearColor];
            rankLabelTV.textColor = [UIColor whiteColor];
            rankLabelTV.text = [NSString stringWithFormat:@"Rank: %@", (NSString *)[[[array objectForKey:@"leaderboards"] objectForKey:@"all"] objectForKey:@"position"]];            
            [TVWindow addSubview:rankLabelTV];

            levelNameLabelTV = [[UILabel alloc] initWithFrame:CGRectMake(222, 244, 441, 22)];
            levelNameLabelTV.backgroundColor = [UIColor clearColor];
            levelNameLabelTV.textColor = [UIColor whiteColor];
            if ((NSNull *)[value objectForKey:@"level"] == [NSNull null]) {
                levelNameLabelTV.text = @"No Level";
            } else {
                levelNameLabelTV.text = [NSString stringWithFormat:@"Level: %@", (NSString *)[[[array objectForKey:@"level"] objectForKey:@"definition"] objectForKey:@"name"]];
            }
            [TVWindow addSubview:levelNameLabelTV];

            pointLabel.text = [information stringForKey:@"pointString"];
            pointLabel.textAlignment = UITextAlignmentLeft;
            displayNameLabelTV.text = [information stringForKey:@"displayNameString"];
            displayNameLabel. text = [information stringForKey:@"displayNameString"];
            rankLabel.text = [information stringForKey:@"rankString"];
            levelLabel.text = [information stringForKey:@"levelString"];

            NSURL *url1 = [NSURL URLWithString: [NSString stringWithFormat:@"%@", (NSString *)[array objectForKey:@"picture_url"]]];
            NSData *urlData1 = [NSData dataWithContentsOfURL:url1];
            UIImage *image1 = [UIImage imageWithData:urlData1];
            profilePicture.image = image1; 
            profilePictureTV.image = image1;    

            [information setObject:[NSString stringWithFormat:@"%@", (NSString *)[luckyNumbers1 objectForKey:@"session"]] forKey:@"sessionID"];
        }}

    NSURLRequest *request2;
    request2 = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://%@/api/widgets/%@/%@/players/%@/rewards.json", [information stringForKey:@"host"], [information objectForKey:@"apiKey"], [information objectForKey:@"URL"], [information objectForKey:@"userID"]]]];
    NSLog(@"Badges Request is: %@", request2);
    NSURLConnection *connection2;
    connection2 = [[NSURLConnection alloc] initWithRequest:request2 delegate:self startImmediately:YES];
    NSURLResponse *resp3;
    NSData *cData2 = [NSURLConnection sendSynchronousRequest:request2 returningResponse:&resp3 error:nil];
    NSString *cDataString2 = [[NSString alloc] initWithData:cData2 encoding:NSUTF8StringEncoding];
    [self getUsersBadges: cDataString2];       
    [[NSURLConnection alloc] initWithRequest:request2 delegate:self];
    //   pass cDataString into the JSON parser and update points

    [connection release];
}

I am making a async request and I'm getting a EXC_BAD_ACCESS on [responseData setLength:0];

The Code is:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    [responseData setLength:0];
}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [responseData appendData:data];
}

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"Connection failed: %@", [error description]);
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    [responseData release];

    luckyNumbers1 = [responseString JSONValue];

    NSUserDefaults *information = [NSUserDefaults standardUserDefaults];
    /*NSArray *luckyNumbers = [json objectWithString:responseString error:&error];*/
    NSLog(@"luckyNumbers1: %@", luckyNumbers1);
    NSLog(@"user Info array is: %@", luckyNumbers1);
    // [information setObject:[NSString stringWithFormat:@"%@", (NSString *)[luckyNumbers1 objectForKey:@"session"]] forKey:@"sessionID"];
    NSDictionary *array = (NSDictionary *)[luckyNumbers1 objectForKey:@"data"];
    NSEnumerator *inner = [luckyNumbers1 objectEnumerator];
    id value;
    while((value = [inner nextObject])) {
        NSLog(@"user Info array is: %@", value);
        if ( [value isKindOfClass:[NSDictionary class]] ) {
            [information setObject:[value objectForKey:@"id"] forKey:@"userID"];
            NSLog(@"uid is: %@", [value objectForKey:@"id"]);
            [information setObject:[NSString stringWithFormat:@"%@", (NSString *)[value objectForKey:@"points_all"]] forKey:@"pointString"];
            [information setObject:[NSString stringWithFormat:@"%@", (NSString *)[[[value objectForKey:@"leaderboards"] objectForKey:@"all"] objectForKey:@"position"]] forKey:@"rankString"];
            if ((NSNull *)[value objectForKey:@"display_name"] == [NSNull null]) {
                [information setObject:@"No Display Name" forKey:@"displayNameString"];
            } else {
                [information setObject:[NSString stringWithFormat:@"%@", (NSString *)[value objectForKey:@"display_name"]] forKey:@"displayNameString"];
            }
            if ((NSNull *)[value objectForKey:@"level"] == [NSNull null]) {} else {
                [information setObject:[NSString stringWithFormat:@"%@", (NSString *)[[[value objectForKey:@"level"] objectForKey:@"definition"] objectForKey:@"name"]] forKey:@"levelString"];
            }
            pointsTV = [[UILabel alloc] initWithFrame:CGRectMake(222, 294, 441, 22)];
            pointsTV.text = [NSString stringWithFormat:@"Points: %@", [information stringForKey:@"pointString"]];
            pointsTV.backgroundColor = [UIColor clearColor];
            pointsTV.textColor = [UIColor whiteColor];
            [TVWindow addSubview:pointsTV];

            rankLabelTV = [[UILabel alloc] initWithFrame:CGRectMake(222, 269, 441, 22)];
            rankLabelTV.backgroundColor = [UIColor clearColor];
            rankLabelTV.textColor = [UIColor whiteColor];
            rankLabelTV.text = [NSString stringWithFormat:@"Rank: %@", (NSString *)[[[array objectForKey:@"leaderboards"] objectForKey:@"all"] objectForKey:@"position"]];            
            [TVWindow addSubview:rankLabelTV];

            levelNameLabelTV = [[UILabel alloc] initWithFrame:CGRectMake(222, 244, 441, 22)];
            levelNameLabelTV.backgroundColor = [UIColor clearColor];
            levelNameLabelTV.textColor = [UIColor whiteColor];
            if ((NSNull *)[value objectForKey:@"level"] == [NSNull null]) {
                levelNameLabelTV.text = @"No Level";
            } else {
                levelNameLabelTV.text = [NSString stringWithFormat:@"Level: %@", (NSString *)[[[array objectForKey:@"level"] objectForKey:@"definition"] objectForKey:@"name"]];
            }
            [TVWindow addSubview:levelNameLabelTV];

            pointLabel.text = [information stringForKey:@"pointString"];
            pointLabel.textAlignment = UITextAlignmentLeft;
            displayNameLabelTV.text = [information stringForKey:@"displayNameString"];
            displayNameLabel. text = [information stringForKey:@"displayNameString"];
            rankLabel.text = [information stringForKey:@"rankString"];
            levelLabel.text = [information stringForKey:@"levelString"];

            NSURL *url1 = [NSURL URLWithString: [NSString stringWithFormat:@"%@", (NSString *)[array objectForKey:@"picture_url"]]];
            NSData *urlData1 = [NSData dataWithContentsOfURL:url1];
            UIImage *image1 = [UIImage imageWithData:urlData1];
            profilePicture.image = image1; 
            profilePictureTV.image = image1;    

            [information setObject:[NSString stringWithFormat:@"%@", (NSString *)[luckyNumbers1 objectForKey:@"session"]] forKey:@"sessionID"];
        }}

    NSURLRequest *request2;
    request2 = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://%@/api/widgets/%@/%@/players/%@/rewards.json", [information stringForKey:@"host"], [information objectForKey:@"apiKey"], [information objectForKey:@"URL"], [information objectForKey:@"userID"]]]];
    NSLog(@"Badges Request is: %@", request2);
    NSURLConnection *connection2;
    connection2 = [[NSURLConnection alloc] initWithRequest:request2 delegate:self startImmediately:YES];
    NSURLResponse *resp3;
    NSData *cData2 = [NSURLConnection sendSynchronousRequest:request2 returningResponse:&resp3 error:nil];
    NSString *cDataString2 = [[NSString alloc] initWithData:cData2 encoding:NSUTF8StringEncoding];
    [self getUsersBadges: cDataString2];       
    [[NSURLConnection alloc] initWithRequest:request2 delegate:self];
    //   pass cDataString into the JSON parser and update points

    [connection release];
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

苍景流年 2024-12-04 22:12:56

如果没有看到 reponseData 的初始化,很难确定,但我猜你要么将其声明为 [NSMutableData data] (它将自动释放),要么在到达 -connection:didReceiveResponse: 之前对其进行 release/autorelease 处理。解决方案是通过调用 retain 或使用 [[NSMutableData alloc] init] 初始化它来确保它不会提前释放。无论哪种情况,您都需要在完成后释放它,尽管看起来您已经在 -connectionDidFinishLoading: 中执行了该操作,因此不需要进行任何更改。

Without seeing your initialization of reponseData, it’s hard to be sure, but I would guess that you’re either declaring it as [NSMutableData data] (which will get autoreleased) or release/autoreleaseing it before you get to -connection:didReceiveResponse:. The solution is to make sure it doesn’t get released early, either by calling retain on it or by initializing it with [[NSMutableData alloc] init]. In either case, you’ll need to release it once you’re done, though it looks as if you’re doing that already in your -connectionDidFinishLoading:, so no change needed there.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文