在拍摄多张照片时,应用程序因内存压力而终止

时间:2015-07-22 05:05:55

标签: ios objective-c iphone

我已经尝试过很多其他问题的解决方案,这些问题和我的一样,但没有什么能帮助我。

让我告诉你我在做什么。我有一个集合视图。在那里我将显示一些将由相机捕获的图像。我一次拍摄多张照片。我拍摄的所有照片,这些图像的地址将首先保存到数据库中,然后这些图像将显示在集合视图中。 现在发生了什么,当我一次点击40-50张图片时,应用程序崩溃,xcode显示一条消息,例如“app因内存压力而终止”。此外,我在日志中收到太多内存警告,但实际上我忽略了它们。

首先,我正在编写拍摄多张照片的代码 -

- (void)imagePickerController:(UIImagePickerController *)picker 
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
  if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
    //Get Image URL from Library
    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
    NSURL *urlPath = [info valueForKey:UIImagePickerControllerReferenceURL];
    if (segmentControl.selectedSegmentIndex != 1) {
        [picker dismissViewControllerAnimated:YES completion:nil];
    }
    if (segmentControl.selectedSegmentIndex == 2) {
        [self insertPicToDB:urlPath];
    }else{
        __block  NSURL *url;
        if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {
            UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
            ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
            // Request to save the image to camera roll
            [library writeImageToSavedPhotosAlbum:[image CGImage] orientation:(ALAssetOrientation)[image imageOrientation] completionBlock:^(NSURL *assetURL, NSError *error){
                if (error) {

                } else {
                    url = assetURL;
                    [self insertPicToDB:url];
                    }
                }];
            }
        }
    }
}

在拍摄每张照片后,我在db中保存图像url,然后同时尝试重新加载集合视图。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
static NSString *identifier = @"Cell";
collectionCell = (CollectionCell *)[_collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
collectionCell.imageView = (UIImageView*)[collectionCell viewWithTag:100];
collectionCell.imageView.image = [UIImage imageNamed:@"placeholder.png"];
    NSString *fileURL = [[recipeImages[indexPath.section] objectAtIndex:indexPath.item] objectForKey:@"FileUrl"];
collectionCell.imagURL = fileURL;
    if ([fileURL hasPrefix:@"assets-library"]) {
        [self getImageFromURL:[NSURL URLWithString:fileURL] :indexPath];
    }else{
        fileURL = [NSString stringWithFormat:@"%@/uploads/thumbnail/%@",[[HttpClient sharedInstance]getBaseURLString],[[fileURL componentsSeparatedByString:@"\\"]lastObject]];
        [collectionCell.imageView setImageWithURL:[NSURL URLWithString:fileURL] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
    }
    return collectionCell;
}

所以条件是,我将继续点击图片,图片将在后台保存。 方法“getImageFromURL”的定义是 -

-(void)getImageFromURL:(NSURL*)yourUrl :(NSIndexPath*)indexPath{
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
{
    ALAssetRepresentation *rep = [myasset defaultRepresentation];
    @autoreleasepool {
        CGImageRef iref = [rep fullScreenImage];
        if (iref) {
            UIImage *image = [UIImage imageWithCGImage:iref];
            dispatch_async(dispatch_get_main_queue(), ^{
                collectionCell = (CollectionCell*)[_collectionView cellForItemAtIndexPath:indexPath];
                if (collectionCell) {
                    NSData *imageData = UIImageJPEGRepresentation(image, 0.1);
                    UIImage *compressedImage = [UIImage imageWithData:imageData];
                    collectionCell.imageView.image = compressedImage;
                }else{
                    collectionCell.imageView.image = nil;
                }
                [collectionCell.imageView setNeedsDisplay];
                [collectionCell setNeedsDisplay];
            });
            iref = nil;
        }
    }
};

ALAssetsLibraryAccessFailureBlock failureblock  = ^(NSError *myerror)
{
    NSLog(@"Can't get image - %@",[myerror localizedDescription]);
};
ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init];
[assetslibrary assetForURL:yourUrl
               resultBlock:resultblock
              failureBlock:failureblock];
}

我也在尝试在集合视图中提取时压缩图像。所以我认为它不会因为集合视图而崩溃。可能是什么原因?是因为我正在使用ALAssetsLibrary还是其他什么?

我正在使用iOS 7.1.1版的iPhone 4S进行调试。

提前致谢。

0 个答案:

没有答案