2015-11-18 2 views
0

У меня есть домашняя страница/просмотр, где отображаются все записи (только заголовок и дата) в списке.Ошибка при преобразовании html в строку в UILabel в IOS

Когда я нажимаю на любую запись, я показываю полную информацию о записи на другой странице. Каждая запись имеет значение строки html, которое необходимо отобразить.

Чтобы отобразить содержимое html, я использую элемент управления UILabel, который отображается правильно.

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

modifiedContent = [modifiedContent stringByAppendingString:[NSString stringWithFormat:@"<style>body{font-family: '%@'; font-size:%fpx;}</style>",@"Helvetica",17.0f]]; 

content.attributedText = [[NSAttributedString alloc] initWithData:[modifiedContent dataUsingEncoding:NSUnicodeStringEncoding] 
           options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, 
           NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)} 
           documentAttributes:nil 
           error:nil]; 

Необходимо ли изменить вышеуказанный код для устранения утечки памяти или существует необходимость в различном типе кодирования.

Она должна поддерживаться от IOS 7 до IOS Текущая версия

Ниже трассировки стека

MyAppName(1098,0x39d7000) malloc: *** mach_vm_map(size=151552) failed (error code=3) 
*** error: can't allocate region 
*** set a breakpoint in malloc_error_break to debug 
MyAppName(1098,0x39d7000) malloc: *** mach_vm_map(size=151552) failed (error code=3) 
*** error: can't allocate region 
*** set a breakpoint in malloc_error_break to debug 
2015-11-19 10:18:59.643 MyAppName[1098:436403] -[__NSCFType encodeWithCoder:]: unrecognized selector sent to instance 0x76954080 
2015-11-19 10:18:59.646 MyAppName[1098:436403] -[NSCoder(CACoderAdditions) CA_encodeObject:forKey:conditional:]: ignoring exception -[__NSCFType encodeWithCoder:]: unrecognized selector sent to instance 0x76954080 
2015-11-19 10:18:59.650 MyAppName[1098:436403] *** NSKeyedArchiver warning: replacing existing value for key ''; probable duplication of encoding keys in class hierarchy 
2015-11-19 10:18:59.660 MyAppName[1098:436403] *** NSKeyedArchiver warning: replacing existing value for key ''; probable duplication of encoding keys in class hierarchy 
2015-11-19 10:18:59.662 MyAppName[1098:436403] *** NSKeyedArchiver warning: replacing existing value for key ''; probable duplication of encoding keys in class hierarchy 
2015-11-19 10:18:59.675 MyAppName[1098:436403] *** NSKeyedArchiver warning: replacing existing value for key ''; probable duplication of encoding keys in class hierarchy 
2015-11-19 10:18:59.677 MyAppName[1098:436403] *** NSKeyedArchiver warning: replacing existing value for key ''; probable duplication of encoding keys in class hierarchy 
2015-11-19 10:18:59.785 MyAppName[1098:436403] *** NSKeyedArchiver warning: replacing existing value for key ''; probable duplication of encoding keys in class hierarchy 
(lldb) 
+0

Что это за проблемы с памятью? Где происходит авария? Что такое исключение (если есть)? Скомпилирован ли код с помощью ARC? Если нет, то происходит утечка памяти. – DarkDust

+0

Версия Xcode, которую я использую, составляет 8.3, а версия iphone - 9.1, поэтому я не могу запустить код непосредственно из xcode. проект не компилируется ARC. Я отредактировал мой вопрос, который содержит трассировку стека, генерируемую из Crittercism – Sharath

ответ

0

Так вы утверждаете, что код не использует ARC, вы протечки в NSAttributedString экземпляр каждый раз при запуске котируемого кода. Чтобы исправить это, вы можете сделать это (я использую неортодоксальное форматирование здесь, чтобы сделать его немного более удобным для чтения здесь на SO, адаптировать его к вашему стилю кодирования, пожалуйста):

NSAttributedString *attributed = [[NSAttributedString alloc] 
    initWithData:[modifiedContent dataUsingEncoding:NSUTF8StringEncoding]   
    options:@{ 
     NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, 
     NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding) 
    }       
    documentAttributes:nil       
    error:nil]; 
content.attributedText = attributed; 
[attributed release]; 

(также: использовать вместо NSUTF8StringEncoding из NSUnicodeStringEncoding или, по крайней мере, быть последовательным который вы используете, вы создали данные, используя одну кодировку, но указали в параметрах, что это будет в другой кодировке.)

+0

Мне очень жаль DarkDust на самом деле используется ARC ... – Sharath

+0

Извините, код использует ARC, я изменил кодировку на NSUTF8StringEncoding. Но все же из-за сбоя кажется, что память течет. Как освободить память, даже если используется ARC. – Sharath

+0

Утечка должна быть где-то в другом месте. Используйте инструменты с инструментом «Утечки», чтобы найти его. – DarkDust