【问题标题】:iOS UIImagePNGRepresentation crash due to "Memory Pressure"iOS UIImagePNGRepresentation 由于“内存压力”而崩溃
【发布时间】:2014-09-04 07:49:51
【问题描述】:

我的视图控制器中有 UIImagePicker 和 UICollectionView。我正在拍照,在第四张照片(它也是收藏视图中的新行)应用程序由于“内存压力”而崩溃。 UIImagePicker 委托:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    // Do picture get here
    NSError *error;
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
    NSData *imageData = UIImagePNGRepresentation(image);
    NSNumber *imageNumber = [NSNumber numberWithInteger:[databaseManagementService selectTaskPictures].count];
    NSString *imageName = [[imageNameDefault stringByAppendingString:[NSString stringWithFormat:objectFormat, imageNumber]] stringByAppendingString:extensionPNG];

    // Do picture save to documents directory here
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *savedImagePath = [documentsDirectory stringByAppendingPathComponent:imageName];
    [imageData writeToFile:savedImagePath atomically:NO];

    // Do UIImagePicker dismiss here
    [picker dismissViewControllerAnimated:YES completion:nil];

    // Do picture details save to database here
    TaskManagerTaskPicture *taskPicture = [[TaskManagerTaskPicture alloc] init];

    taskPicture.filename = imageName;
    taskPicture.id = imageNumber;
    taskPicture.title = imageName;

    taskPicture.pictureID = self.taskObject.id;
    taskPicture.taskID = self.taskObject.id;
    taskPicture.locationID = self.taskObject.location.id;

    [databaseManagementService insertTaskPictureObject:taskPicture andError:&error];

    // Do task picture update here
    // Do task object SELECT here
    self.taskObject = [databaseManagementService selectTaskWithID:self.taskObject.id];

    // Do task picture objects retreive from task object here
    self.taskPictureObjects = [self.taskObject.taskPicture allObjects];

    // Do collection data reload here
    [self.taskPicturesCollectionView reloadData];
}

直到现在我才出道,才意识到麻烦正在逐行消除:

NSData *imageData = UIImagePNGRepresentation(image);

有人知道如何解决这个问题吗?

【问题讨论】:

  • 检查您选择的图像的大小..
  • 3264 × 2448。大小重要吗?
  • 显然大小很重要,这就是您崩溃的原因。调整图像大小或将选择器质量设置为低质量以避免崩溃。
  • 那么,是什么原因呢?沙盒内存不够?

标签: ios


【解决方案1】:

你能更好地解释一下你的应用程序的流程吗?

但是尝试实现此代码:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    // Do picture get here

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        NSError *error;
        UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
        NSData *imageData = UIImagePNGRepresentation(image);

        NSNumber *imageNumber = [NSNumber numberWithInteger:[databaseManagementService selectTaskPictures].count];
        NSString *imageName = [[imageNameDefault stringByAppendingString:[NSString stringWithFormat:objectFormat, imageNumber]] stringByAppendingString:extensionPNG];

        // Do picture save to documents directory here
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *savedImagePath = [documentsDirectory stringByAppendingPathComponent:imageName];
        [imageData writeToFile:savedImagePath atomically:YES];
        dispatch_async(dispatch_get_main_queue(), ^{
            // Do UIImagePicker dismiss here
            [picker dismissViewControllerAnimated:YES completion:nil];

            // Do picture details save to database here
            TaskManagerTaskPicture *taskPicture = [[TaskManagerTaskPicture alloc] init];

            taskPicture.filename = imageName;
            taskPicture.id = imageNumber;
            taskPicture.title = imageName;

            taskPicture.pictureID = self.taskObject.id;
            taskPicture.taskID = self.taskObject.id;
            taskPicture.locationID = self.taskObject.location.id;

            [databaseManagementService insertTaskPictureObject:taskPicture andError:&error];

            // Do task picture update here
            // Do task object SELECT here
            self.taskObject = [databaseManagementService selectTaskWithID:self.taskObject.id];

            // Do task picture objects retreive from task object here
            self.taskPictureObjects = [self.taskObject.taskPicture allObjects];

            // Do collection data reload here
            [self.taskPicturesCollectionView reloadData];
        });
    });

}

【讨论】:

  • 嗨!抱歉,您的解决方案不起作用。这个应用程序只是捕获图片并将其保存到文档目录以及将图片类型的元数据保存到数据库。
猜你喜欢
  • 2014-03-30
  • 2013-10-15
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多