2010-08-11 2 views
1

У меня была проблема с моим iPad-приложением, то есть мне нужно загрузить более 10 000 изображений с сервера за раз. Я успешно загрузил более 8000 изображений, но после этого у меня появилось исключение, такое как «Полученный сигнал программы:« 0 ». Data Formatters временно недоступен, повторите попытку после« продолжения ». (Неизвестная ошибка загрузки общей библиотеки»/Developer /usr/lib/libXcodeDebuggerSupport.dylib ") (gdb)" это в отладчике. Я проверил управление памятью. В управлении памятью нет проблем. Но все же я получил исключение. Пожалуйста, помогите мне.Data Formatters временно недоступен

Заранее благодарен, Sekhar Bethalam.

ответ

2

форматтеры данных используются так, что отладчик может представлять собой объект, как больше, чем просто указатель или целое значение (например, форматтеры данных позволяют отладчик, чтобы показать вам основную ценность NSNumber или элементы внутри NSArray, и т.д.). Иногда —, и я не уверен, почему — они просто перестают работать. В любом случае тот факт, что форматирование данных не работает, не является корнем проблемы.

Не видя ни одного из ваших кодов (например, как вы загружаете и/или сохраняете изображения), вам нелегко диагностировать вашу проблему. После некоторых поисков в Google, кажется, что программы на iPhone OS получают сигнал 0, когда они используют слишком много ресурсов (не обязательно просто память). Вы ничего не можете сделать, чтобы остановить iPhone от убийства вашей программы, когда захочет.

Несколько вопросов:

  • Вы пытаетесь загрузить 10000 изображений одновременно или последовательно? Надеюсь, последовательно!
  • Несмотря на то, что в вашем коде обнаружены утечки, ваша программа все еще может использовать слишком много памяти. Поддерживаете ли вы ссылки на эти изображения в массиве или что-то подобное?
  • Вы в узкой петле? Ваш код может не содержать ссылки на какие-либо данные/URL-адреса/изображения, но может быть пул авторесурсов. В условиях жесткой петли иногда желательно создать новый пул авторезистов в начале цикла и высвободить его внизу. Например:

    for (NSUInteger i = 0; i < 10000; i++) 
    { 
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
        // do the work to get the image. Objects are automatically added to the 
        // most recently created autorelease pool in the current thread. 
        [pool release]; 
    } 
    
1

Это мой код, который я уже упоминал выше,

для (INT I = 0; я < 10000; я ++) { Е ("\ п порождающие изображения. .............:% d», я); i ++;

 UIImageView* imageView=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, spotItem.imageWidth, spotItem.imageHight)]; 
     NSData *receivedData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://sererpath/prudently/iphone/image_s/e545afbf-4e3e-442e-92f9-a7891fc3ea9f/test.png"]]; 
     imageView.image = [[UIImage alloc] initWithData:receivedData] ; 
     //imageView.image=[UIImage imageNamed:@"1.png"]; 
     [spotItem.subView addSubview:imageView]; 
     [imageView release]; 



    } 

Я загружал их напрямую.

+1

Да, проблема может заключаться в том, что вы создаете два объекта с автореализацией на каждой итерации цикла ('NSData' и' NSURL'). Это означает, что, как только ваша петля закончится, пул авторесурсов будет содержать не менее 20 000 наименований (и кто знает, сколько памяти эти 20 000 предметов используются в целом!). Попробуйте следовать моему совету в моем ответе (создание NSAutoreleasePool в начале цикла и его выпуск в конце). – dreamlax

Смежные вопросы