0

我试图将图像延迟加载到我的 tableview 中,但是当我尝试将一个特定图像插入到我的图像数组中时,我得到了一个双重免费 malloc 错误。

这是错误:“标志(8079,0xa0258540)malloc:* 对象 0x6a51b40 的错误:double free *在 malloc_error_break 中设置断点进行调试”。

这是我的代码:

#import "ViewController.h"
#import "ASync.h"

@implementation ViewController
@synthesize tableView;
@synthesize countryNamesArray;
@synthesize receivedData; 
@synthesize flagImage;
@synthesize flagImagesArray;
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle
-(void)issueRequest:(NSString *)fullCountryImageURL{

    NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:fullCountryImageURL]
                                              cachePolicy:NSURLRequestUseProtocolCachePolicy
                                          timeoutInterval:60.0];
    // create the connection with the request
    // and start loading the data
    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
    if (theConnection) {
        // Create the NSMutableData to hold the received data.
        // receivedData is an instance variable declared elsewhere.
        receivedData = [NSMutableData data];                                    
    } 
    else {
        // Inform the user that the connection failed.
    }
}

- (void)viewDidLoad
{   
    flagImagesArray = [[NSMutableArray alloc]init];
    for(int x=0; x<16; x++){
        [flagImagesArray insertObject:[UIImage imageNamed: @"jollyroger_poisonflag.jpg"] atIndex:x];

    }
    countryNamesArray=[[NSArray alloc] initWithObjects:@"India",@"USA",@"Antarctica",@"Brazil",@"Canada",@"China",@"France",@"Germany",@"Italy",@"Japan",@"Kenya",@"Malaysia",@"Mexico",@"South Africa",@"United Kingdom",@"Vietnam",nil];


    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
    } else {
        return YES;
    }
}

-(NSInteger)tableView:(UITableView *)tableview numberOfRowsInSection:(NSInteger)section{
    return 16;
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    // This method is called when the server has determined that it
    // has enough information to create the NSURLResponse.

    // It can be called multiple times, for example in the case of a
    // redirect, so each time we reset the data.

    // receivedData is an instance variable declared elsewhere.
    [receivedData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    // Append the new data to receivedData.
    // receivedData is an instance variable declared elsewhere.
    [receivedData appendData:data];
}
- (void)connection:(NSURLConnection *)connectiondidFailWithError:(NSError *)error
{
    // release the connection, and the data object
    // receivedData is declared as a method instance elsewhere


    // inform the user
    NSLog(@"Connection failed! Error - %@ %@",
          [error localizedDescription],
          [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]);
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    // do something with the data
    // receivedData is declared as a method instance elsewhere
    NSLog(@"Succeeded! Received %d bytes of data",[receivedData length]);
    flagImage = [UIImage imageWithData: receivedData];
    if([receivedData length]==19935){
        for (NSIndexPath *indexPath in [tableView indexPathsForVisibleRows]){
            if(indexPath.row==0)
                [flagImagesArray replaceObjectAtIndex:0 withObject:flagImage];
        }
    }
    else if([receivedData length]==9280){
        for (NSIndexPath *indexPath in [tableView indexPathsForVisibleRows]){
            if(indexPath.row==1)
                [flagImagesArray replaceObjectAtIndex:1 withObject:flagImage];
        }
    }
    else if([receivedData length]==9567){
        for (NSIndexPath *indexPath in [tableView indexPathsForVisibleRows]){
            if(indexPath.row==2)
                [flagImagesArray replaceObjectAtIndex:2 withObject:flagImage];
        }
    }
    else if([receivedData length]==12152){
        for (NSIndexPath *indexPath in [tableView indexPathsForVisibleRows]){
            if(indexPath.row==3)
                [flagImagesArray replaceObjectAtIndex:3 withObject:flagImage];
        }
    }
    else if([receivedData length]==10903){
        for (NSIndexPath *indexPath in [tableView indexPathsForVisibleRows]){
            if(indexPath.row==4)
                [flagImagesArray replaceObjectAtIndex:4 withObject:flagImage];
        }
    }
    else if([receivedData length]==11298){
        for (NSIndexPath *indexPath in [tableView indexPathsForVisibleRows]){
            if(indexPath.row==5)
                [flagImagesArray replaceObjectAtIndex:5 withObject:flagImage];
        }
    }
    else if([receivedData length]==8682){
        for (NSIndexPath *indexPath in [tableView indexPathsForVisibleRows]){
            if(indexPath.row==6)
                [flagImagesArray replaceObjectAtIndex:6 withObject:flagImage];
        }
    }
    else if([receivedData length]==6865){
        for (NSIndexPath *indexPath in [tableView indexPathsForVisibleRows]){
            if(indexPath.row==7)
                [flagImagesArray replaceObjectAtIndex:7 withObject:flagImage];
        }
    }
    else if([receivedData length]==10567){
        for (NSIndexPath *indexPath in [tableView indexPathsForVisibleRows]){
            if(indexPath.row==8)
                [flagImagesArray replaceObjectAtIndex:8 withObject:flagImage];
        }
    }
    else if([receivedData length]==9423){
        for (NSIndexPath *indexPath in [tableView indexPathsForVisibleRows]){
            if(indexPath.row==9)
                [flagImagesArray replaceObjectAtIndex:9 withObject:flagImage];
        }
    }
    else if([receivedData length]==820){
        for (NSIndexPath *indexPath in [tableView indexPathsForVisibleRows]){
            if(indexPath.row==10)
                **[flagImagesArray replaceObjectAtIndex:10 withObject:flagImage];**
        }
    }
    else if([receivedData length]==12238){
        for (NSIndexPath *indexPath in [tableView indexPathsForVisibleRows]){
            if(indexPath.row==11)
                [flagImagesArray replaceObjectAtIndex:11 withObject:flagImage];
        }
    }
    else if([receivedData length]==5980){
        for (NSIndexPath *indexPath in [tableView indexPathsForVisibleRows]){
            if(indexPath.row==12)
                [flagImagesArray replaceObjectAtIndex:12 withObject:flagImage];
        }
    }
    else if([receivedData length]==10562){
        for (NSIndexPath *indexPath in [tableView indexPathsForVisibleRows]){
            if(indexPath.row==13)
                [flagImagesArray replaceObjectAtIndex:13 withObject:flagImage];
        }
    }
    else if([receivedData length]==9690){
        for (NSIndexPath *indexPath in [tableView indexPathsForVisibleRows]){
            if(indexPath.row==14)
                [flagImagesArray replaceObjectAtIndex:14 withObject:flagImage];
        }
    }
    else if([receivedData length]==11590){
        for (NSIndexPath *indexPath in [tableView indexPathsForVisibleRows]){
            if(indexPath.row==15)
                [flagImagesArray replaceObjectAtIndex:15 withObject:flagImage];
        }
    }


    [tableView reloadData];
}



-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *cellIdentifier = @"countryCell";
    static int numberOfRequests=0;
    UITableViewCell *cell=(UITableViewCell *) [self.tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell==nil){
        cell=[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
    }

    // Create the request.

    NSString *flagImageURLPartOne = @"http://www.imageslink/";
    NSString *countryNumber = [NSString stringWithFormat:@"%i", indexPath.row];
    NSString *flagImageURLPartTwo = @".png";
    NSString *fullCountryImageURL = [NSString stringWithFormat:@"%@%@%@", flagImageURLPartOne, countryNumber, flagImageURLPartTwo];
    [self issueRequest:fullCountryImageURL];
    numberOfRequests++;



    cell.imageView.image=[flagImagesArray objectAtIndex:indexPath.row];
    cell.textLabel.text= [countryNamesArray objectAtIndex:indexPath.row];

    return cell;
}

-(void) tableView:(UITableView *) tableview didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
}


@end

引发错误的行以粗体显示 - 它位于代码行下方:“[flagImagesArray replaceObjectAtIndex:10 withObject:flagImage];”。当我将此行注释掉时,所有其他图像都可以正常加载。有人对问题所在有任何想法吗?

4

2 回答 2

1

Only for completion's sake.

The problem is most probably with the image. The image might be corrupted. Using break points inside the 820 bracket will tell us where the error has occurred.

In cases like these. I always suggest doing a count on the data just to be sure about the data transferred from the server.

And John solved the problem. The problem was

I had one link that was pulling in a "Page Not Found" rather than an image.

于 2012-10-09T18:53:20.273 回答
1

转到断点选项卡,在左下角单击添加按钮并选择“添加异常断点”并单击完成。

再次运行您的代码,您将准确找到崩溃的时间和地点,以及所有调试信息

于 2012-10-09T18:00:27.140 回答