我在 a 中显示不同类型的内容,tableview
并使用不同的自定义方法计算每个单元格的高度,在heightForRowAtIndexPath
.
其中一种自定义方法意味着在 中转换一些 html NSMutableAttributedString
,然后计算 this 的高度NSMutableAttributedString
。
对于 html 转换,我使用新initWithData:
方法。
一切正常,除非我旋转屏幕 => 我每次都有一个 exc_bad_access。
使用 Instruments / Zombies,我已经能够找到错误,实际上就是这个initWithData:
.
(当我删除此方法并使用 创建“简单”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);
}
使用 initWithData 进行 html 转换的自定义方法NSMutableAttributedString
:
< 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;
}
如果我用一个简单的 initWithString 替换 initWithData 不再有 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;
}