NSDATA writeToFile вылетает без причины - PullRequest
1 голос
/ 11 апреля 2011

Я загружаю изображения из URL, используя NSDATA, и сохраняю их в локальной файловой системе, используя

NSData *dataForStorage = [NSData dataWithData:UIImagePNGRepresentation(img)];


    BOOL saveResult=[ dataForStorage writeToFile:jpegFilePath options:NSDataWritingAtomic error:&error];
    NSLog(@"Write returned error: %@", [error localizedDescription]);

Мое приложение аварийно завершает работу, даже не отправляя сообщения, хотя некоторые файлы сохраняются (опять же случайно). Когда я запускаю приложение в режиме отладки, я часто вижу «EXC_BAD_ACCESS», но при продолжении выполнения удается сохранить некоторые файлы.

Этот код выполняется в фоновом режиме из:

[self performSelectorInBackground:@selector(loadImageInBackground:) withObject:arr];

Пожалуйста, предложите.

Ответы [ 3 ]

1 голос
/ 12 апреля 2011

Одной из проблем в вашем коде является то, что вы выполняете код в потоке без пула автоматического выпуска, но используете функции, которые его требуют. Поместите следующий код в метод loadImageInBackground:

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

// existing code

[pool drain];

Это, вероятно, одна из нескольких проблем. Для дальнейшей помощи нам нужно увидеть трассировку стека аварии.

1 голос
/ 11 апреля 2011

Просто дикое предположение: arr - это объект с автоматическим освобождением, поэтому иногда он освобождается до вызова вашего селектора. Попробуйте использовать [arr copy] и отпустите его после сохранения.

0 голосов
/ 18 мая 2011

У меня была ТОЧНАЯ та же проблема, но оказалось, что проблема была в чем-то другом: мой URL получал преждевременный выпуск В конце концов это то, что я сделал, и это сработало:

Я сделал этот звонок:

[self performSelectorInBackground:@selector(downloadData:) withObject:nil];

И это метод:

// URL - (NSString) URL for file
// filePath - (NSString) save location on device
-(void)download:(NSString *)URL
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:URL]];
    [data writeToFile:filePath atomically:YES];
    [pool release];
}

Так что я думаю, что ваш код загрузки корректен, но есть другая переменная, которая освобождается рано (возможно, ваш путь).

Надеюсь, это поможет! Я знаю, что другие ответы на этой странице работали для меня.

...