Objective C-код для обработки большого объема данных в iPhone - PullRequest
1 голос
/ 17 июня 2010

У меня был следующий код, который принимает 14 МБ или более данных изображения, закодированных в строке base4, и преобразует их в формат JPEG перед записью в файл в iphone.Это приводит к сбою моей программы, выдающему следующую ошибку: Программа получила сигнал: «0».предупреждение: check_safe_call: не удалось восстановить текущий кадр

Я настраиваю свою программу, и она может обработать еще несколько изображений, прежде чем ошибка появится снова.Моя кодировка выглядит следующим образом:

// parameters is an array where the fourth element contains a list of images in base64 >encoded string 

NSMutableArray *imageStrList = (NSMutableArray*) [parameters objectAtIndex:5]; 
while (imageStrList.count != 0) {   
    NSString *imgString = [imageStrList objectAtIndex:0];  
    // Create a file name using my own Utility class
    NSString *fileName = [Utility generateFileNName];
    NSData *restoredImg = [NSData decodeWebSafeBase64ForString:imgString];
    UIImage *img = [UIImage imageWithData: restoredImg];
    NSData *imgJPEG = UIImageJPEGRepresentation(img, 0.4f); 
   [imgJPEG writeToFile:fileName atomically:YES];
   [imageStrList removeObjectAtIndex:0];
}

Я попытался поиграться с UIImageJPEGRepresentation и обнаружил, что чем меньше значение, тем больше изображений он может обрабатывать, но это не должно быть так.Мне интересно, есть ли в любом случае, чтобы освободить память imageStrList сразу после обработки каждого изображения, чтобы оно могло использоваться следующим в строке.

Ответы [ 2 ]

1 голос
/ 17 июня 2010

Ваша проблема в том, что UIImage s и NSData s накапливаются в памяти в цикле.Обычно пул авто-выпусков позаботится об этом в конце цикла событий, но вы не позволите ему зайти так далеко.У вас есть два варианта:

  1. Явное выделение / init и последующее освобождение по завершении объектов UIImage и NSData вместо использования методов + класса.
  2. Создание явного автоматического выпускабассейн внутри петли, и слить его в конце.Сделайте это с:

    NSAutoreleasePool * myPool = [[NSAutoreleasePool alloc] init];

    [myPool release];

0 голосов
/ 17 июня 2010
NSMutableArray *imageStrList = (NSMutableArray*) [parameters objectAtIndex:5]; 
while (imageStrList.count != 0) {
    NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init];
    NSString *imgString = [imageStrList objectAtIndex:0];  
    // Create a file name using my own Utility class
    NSString *fileName = [Utility generateFileNName];
    NSData *restoredImg = [NSData decodeWebSafeBase64ForString:imgString];
    UIImage *img = [UIImage imageWithData: restoredImg];
    NSData *imgJPEG = UIImageJPEGRepresentation(img, 0.4f); 
   [imgJPEG writeToFile:fileName atomically:YES];
   [imageStrList removeObjectAtIndex:0];
   [pool release];
}

Вам следует создать еще один автозапуск внутри цикла, поскольку объекты, созданные внутри цикла, не будут освобождены, пока программа не выйдет из цикла.Пул автоматического освобождения внутри цикла будет каждый раз освобождать все объекты, созданные внутри цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...