Ich zeige verschiedene Arten von Inhalten in einem tableview
und berechnen Sie die Höhe jeder Zelle mit verschiedenen benutzerdefinierten Methoden, in heightForRowAtIndexPath
.NSMutableAttributedString initWithData: verursacht EXC_BAD_ACCESS bei Rotation
Eine dieser benutzerdefinierten Methoden impliziert das Konvertieren einiger HTML in einem NSMutableAttributedString
und das Berechnen der Höhe dieses NSMutableAttributedString
. Für die HTML-Konvertierung verwende ich die neue initWithData:
Methode.
Alles funktioniert einwandfrei, außer wenn ich den Bildschirm rotiere => Ich habe jedes Mal einen exc_bad_access.
Mit Hilfe von Instrumenten/Zombies konnte ich den Fehler lokalisieren, und tatsächlich ist es das initWithData:
.
(Wenn ich diese Methode entfernen und erstellen Sie eine "einfache" NSMutableAttributedString
mit , kann ich die Orientierung so oft ändern, wie ich will, keine crash
mehr).
Irgendeine Idee warum?
(By the way, mein Projekt ARC verwenden)
Instrument/Zombie-Screenshot:
Eigene Methode in heightForRowAtIndexPath
genannt:
< UtilitiesForFrontEndUI heightForFacebookAttributedText
:>
+(CGFloat)heightForFacebookAttributedText:(NSString *)attributedText withWidth:(CGFloat)width
{
NSAttributedString *formatedText = [self formatRawFacebookContentForFrontEndRichTextContents:attributedText];
CGRect rect= [formatedText boundingRectWithSize:CGSizeMake(width, 1000) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil];
return ceilf(rect.size.height);
}
Benutzerdefinierte Methode, um die initWithData für html NSMutableAttributedString
Konvertierung mit:
< UtilitiesForFrontEndUI formatRawFacebookContentForFrontEndRichTextContents:
>
+(NSAttributedString *)formatRawFacebookContentForFrontEndRichTextContents:(NSString *)stringToFormat
{
// THIS GENERATE EXC_BAD_ACCESS ON DEVICE ROTATION (WORKS IF NO ROTATION)
NSData *dataContent = [stringToFormat dataUsingEncoding:NSUTF8StringEncoding];
NSMutableAttributedString *richTxtContent = [[NSMutableAttributedString alloc] initWithData:dataContent options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,NSCharacterEncodingDocumentAttribute: [NSNumber numberWithInt:NSUTF8StringEncoding]} documentAttributes:nil error:nil];
NSRange myRange;
myRange.location = 0;
myRange.length = richTxtContent.length;
[richTxtContent addAttributes:[self commonAttributesForFrontEndRichText] range:myRange];
return richTxtContent;
}
Wenn ich ersetzen initWithData durch eine einfache initWithString nicht mehr EXC_BAD_ACCESS
+(NSAttributedString *)formatRawFacebookContentForFrontEndRichTextContents:(NSString *)stringToFormat
{
// THIS WORKS (NO MORE ROTATION CRASH)
NSMutableAttributedString *richTxtContent = [[NSMutableAttributedString alloc]initWithString:stringToFormat];
NSRange myRange;
myRange.location = 0;
myRange.length = richTxtContent.length;
[richTxtContent addAttributes:[self commonAttributesForFrontEndRichText] range:myRange];
return richTxtContent;
}
Danke, sind Sie wahrscheinlich Recht (so dass ich die Antwort akzeptiert). Ich ging den TTTAttributedLabel Weg, wie ich auch klickbare "Verbindungen" innerhalb dieses attributedString haben wollte. Es funktioniert perfekt (nach einigen harten Zeiten lernen, wie man es richtig verwendet) = sehr schnell + flexibel und einfach zu integrieren/verwalten + Delegieren Methoden – macbeb
Ich würde hinzufügen, dass Apple ausdrücklich sagt, verwenden Sie nicht die UIKit-Version auf einem Hintergrund-Thread. Ich habe das mit performSelectorOnMainThread behoben: object: waitUntilDone: und es funktioniert wie ein Zauber. –
@Jesse Naugher Ich weiß, das ist etwas alt, aber wie hast du 'performSelectorOnMainThread: object: waitUntilDone:' in Verbindung mit dieser Antwort, die Sie kommentiert? In ein ähnliches Problem geraten und nach einer Lösung suchen. –