NSDATA writeToFile аварийно завершает работу без причины

Я загружаю изображения с 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];

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


person Monica Chaturvedi    schedule 11.04.2011    source источник
comment
Можете ли вы опубликовать журнал сбоев и журнал консоли, пожалуйста?   -  person Joze    schedule 11.04.2011
comment
Это приложение для iPhone на iOS или приложение для Mac на MacOS?   -  person Codo    schedule 11.04.2011
comment
Это приложение для iPad. Вот журнал консоли: 2011-04-11 16:36:59.784 AJiPadPhotos[5881:7203] *** __NSAutoreleaseNoPool(): Объект 0x4e222c0 класса NSHTTPURLResponse автоматически выпущен без пула - просто утечка 2011-04-11 16: 36:59.784 AJiPadPhotos[5881:7203] *** __NSAutoreleaseNoPool(): объект 0x4b41c80 класса __NSCFData выпущен автоматически без пула — просто утечка (): Объект 0x4e23ba0 класса NSConcreteData автоматически выпущен без пула — просто утечка   -  person Monica Chaturvedi    schedule 11.04.2011
comment
@Моника, если он выйдет из строя, вы должны получить трассировку стека.   -  person Twelve47    schedule 11.04.2011
comment
@ Twelve47, это даже не отражает ошибку ... нет трассировки стека, ничего ... есть подсказки, в чем может быть проблема?   -  person Monica Chaturvedi    schedule 11.04.2011
comment
Является ли jpegFilePath действительным? Возможно, он уже выпущен?   -  person Twelve47    schedule 11.04.2011


Ответы (3)


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

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

// existing code

[pool drain];

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

person Codo    schedule 12.04.2011
comment
Привет, Кодо. Спасибо за ответ. Они у меня уже есть, я просто исключил их здесь для краткости. Что-нибудь еще, что можно было бы сделать? - person Monica Chaturvedi; 13.04.2011
comment
Да, добавьте к вопросу трассировку стека сбоя. - person Codo; 13.04.2011

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

person Marcelo Alves    schedule 11.04.2011
comment
Параметры withObject: в различных методах PerformSelector сохраняются для вас, поэтому я не вижу в этом проблемы. - person Mike Weller; 11.04.2011
comment
Спасибо @Marcelo, но это не помогло :( Любая другая идея? - person Monica Chaturvedi; 12.04.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];
}

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

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

person mtmurdock    schedule 18.05.2011