でさまざまな種類のコンテンツを表示し、tableview
さまざまなカスタム メソッドを使用して各セルの高さを計算しheightForRowAtIndexPath
ます。
これらのカスタム メソッドの 1 つは、一部の html を に変換してNSMutableAttributedString
から、この の高さを計算することを意味しNSMutableAttributedString
ます。
HTML 変換には、新しいinitWithData:
メソッドを使用します。
画面を回転する場合を除いて、すべてが完全に機能します => 毎回 exc_bad_access が発生します。
Instruments / Zombies を使用して、エラーを見つけることができました。実際、それは thisinitWithData:
です。
(このメソッドを削除して で「シンプル」NSMutableAttributedString
を作成するとinitWithString
、向きを何度でも変更できcrash
ます)。
理由はありますか?
(ちなみに、私のプロジェクトはARCを使用しています)
楽器/ゾンビのスクリーンショット:
で呼び出されるカスタム メソッドheightForRowAtIndexPath
:
< 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);
}
html から conversion に initWithData を使用するカスタム メソッドNSMutableAttributedString
:
<FrontEndUI のユーティリティ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;
}
initWithData を単純な initWithString に置き換えると、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;
}