简体   繁体   中英

UICollectionView Crashes on iOS 6.0 on iPhone 3GS

The app supposedly crashes while displaying the UICollectionView. It creates a low memory crash log as well. How can I reduce the memory usage in UICollectionView? I am using ARC in the project. Please help...(PS below is my code)

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
    return [untaggedImagesArray count];
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    @autoreleasepool {

    static NSString *identifier = @"imageCell";
    imageCell *cvc = (imageCell *)[self.iamgesCollectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
    if(cvc == nil){
        NSArray *topLevelObjects = [[NSBundle mainBundle]loadNibNamed:@"imageCell" owner:nil options:nil];
        for(id currentObject in topLevelObjects){
            if([currentObject isKindOfClass: [imageCell class]]){
                cvc = (imageCell*)currentObject;


                break;
            }
        }
    }
    NSString *path = [untaggedImagesArray objectAtIndex:indexPath.row];
         NSString *path = [untaggedImagesArray objectAtIndex:indexPath.row];
    //[self performSelectorInBackground:@selector(getImage:) withObject:path];

    UIImage *cache_image = [images_cache objectForKey:path];

    if(cache_image)
    {
        [cvc.imageView setImage:cache_image];
    }
    else
    {
        [self performSelectorInBackground:@selector(getImage:) withObject:path];
        //UIImage *img = [UIImage imageWithContentsOfFile:path];
        [images_cache setObject:cellImage forKey:path];
         [cvc.imageView setImage:cellImage];
    }


    if([preTaggedPaths containsObject:path]){
        [cvc.tagLabel setText:[tagStringsDict valueForKey:[NSString stringWithFormat:@"%d",indexPath.row]]];
        [cvc setUserInteractionEnabled:NO];
    }else{
        [cvc.tagLabel setText:@""];
        [cvc setUserInteractionEnabled:YES];
    }

        if([selectedImagesPath containsObject:path]){
            [cvc.checkImageView setImage:[UIImage imageNamed:@"checkbox_small_selected.png"]];
        }else{
            [cvc.checkImageView setImage:[UIImage imageNamed:@"checkbox_small_unselected.png"]];
        }

//
    return cvc;
    }
}



-(void)getImage:(NSString*)path{
    cellImage = [UIImage imageWithContentsOfFile:path];
}

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"clicked to select at index%d",indexPath.row);
    imageCell *cvc = (imageCell*)[self.iamgesCollectionView cellForItemAtIndexPath:indexPath];
    NSString *pathString = [untaggedImagesArray objectAtIndex:indexPath.row];
    [cvc.checkImageView setImage:[UIImage imageNamed:@"checkbox_small_selected.png"]];
    [selectedImagesPath addObject:pathString];
}

- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath {
     NSLog(@"clicked to DEselect at index%d",indexPath.row);
    imageCell *cvc = (imageCell*)[self.iamgesCollectionView cellForItemAtIndexPath:indexPath];
    NSString *pathString = [untaggedImagesArray objectAtIndex:indexPath.row];
    [cvc.checkImageView setImage:[UIImage imageNamed:@"checkbox_small_unselected.png"]];
    [selectedImagesPath removeObject:pathString];
//    [cvc setSelected:NO];
}

-

(void)getImage:(NSString*)path{
    //cellImage = [UIImage imageWithContentsOfFile:path];
    NSLog(@"image path: %@", path);
    cellImage = [UIImage imageNamed:path];

}

Your are saying that the crash is caused by low memory!

A possible problem is your image loading mechanism (What's the size of your images?):

[UIImage imageWithContentsOfFile:path];

This will be executed every time for each cell in your collection view.

[UIImage imageNamed:@"name"];

for example is caching the image, whereas imageWithContentsOfFile does not!

So UIImage's methods imageNamed: and imageWithContentsOfFile do slightly different things. imageNamed loads the image in a special system cache, and then future calls with that image path will return the image in the cache instead of reloading it from disk. imageWithContentsOfFile simply loads the image at the path you specify, but does no caching. Multiple calls to imageWithContentsOfFile for the same image will result in multiple copies in memory.

If this is your problem, try caching the images or use a smart way to only load images which are being displayed at the moment.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM