【发布时间】:2014-01-10 21:24:30
【问题描述】:
我在tableview 中显示不同类型的内容,并在heightForRowAtIndexPath 中使用不同的自定义方法计算每个单元格的高度。
这些自定义方法之一意味着转换NSMutableAttributedString 中的一些html,然后计算此NSMutableAttributedString 的高度。
对于 html 转换,我使用新的 initWithData: 方法。
除了我旋转屏幕时,一切都完美无缺 => 我每次都有 exc_bad_access。
使用 Instruments / Zombies,我已经能够找到错误,实际上是这个 initWithData:。
(当我删除此方法并使用initWithString 创建一个“简单”NSMutableAttributedString 时,我可以随意更改方向,不再需要crash。
知道为什么吗?
(顺便说一下,我的项目使用ARC)
仪器/僵尸截图:
heightForRowAtIndexPath 中调用的自定义方法:
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的转换:
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;
}
【问题讨论】:
标签: ios ios7 exc-bad-access nsmutableattributedstring