Iphone 惰性TableView图像加载Malloc错误

Iphone 惰性TableView图像加载Malloc错误,iphone,objective-c,Iphone,Objective C,我试图将图像延迟加载到我的tableview中,但是当我尝试将一个特定图像插入到图像数组中时,我得到了一个双重自由malloc错误 这是错误:Flags8079,0xa0258540 malloc:*对象0x6a51b40的错误:双重自由 *在malloc\u error\u break中设置断点以进行调试 这是我的密码: #import "ViewController.h" #import "ASync.h" @implementation ViewController @synthesiz

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

这是错误:Flags8079,0xa0258540 malloc:*对象0x6a51b40的错误:双重自由 *在malloc\u error\u 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];。当我将这行注释掉时,所有其他图像都会加载良好。有人知道问题是什么吗?

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


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

,只是为了完成

问题很可能出在图像上。图像可能已损坏。使用820支架内的断点将告诉我们错误发生的位置

在这种情况下。我总是建议对数据进行计数,以确定从服务器传输的数据

约翰解决了这个问题。问题是

我有一个链接是拉在一个网页没有找到,而不是一个图像


我看不到粗线条。你是说这个吗?[FlagImagesRay replaceObjectAtIndex:10 with Object:flagImage];对我不知道该怎么大胆。它所做的只是在它的周围加上星号。因为它在一个代码中,这可能就是原因。你能输入你收到的错误吗?我建议先检查长度,然后再检查你得到的820的图像。可能存在图像损坏。可以启用僵尸并查看发生了什么吗?因此,我可以通过更改以下行来修复崩溃:NSString*countryNumber=[NSString stringWithFormat:@%I,indexPath.row];至NSString*countryNumber=[NSString stringWithFormat:@%i,indexPath.row+1]。很明显,我根本没有发送这个图像的请求。但是,现在发生的情况是图像从未加载。一个占位符就留在那里。考虑到所有其他图像的加载都很好,并且问题图像的链接也很好,这是很奇怪的。