14

でさまざまな種類のコンテンツを表示し、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;
}
4

1 に答える 1