更新 NSTextStorage 字体时崩溃
Crash when updating NSTextStorage font
我的UITextView
响应UIContentSizeCategoryDidChangeNotification
响应动态字体变化,我实现了如下代码:
NSTextStorage * textStorage = [self textStorage];
[textStorage beginEditing];
[textStorage enumerateAttribute: NSFontAttributeName
inRange: NSMakeRange(0, [textStorage length])
options: 0
usingBlock: ^(id value, NSRange range, BOOL * stop) {
UIFont *newFont = [UIFont fontWithDescriptor: [UIFontDescriptor preferredFixedFontDescriptorWithTextStyle: IDFontTextStyleFixed] size: 0.0f];
if (newFont) {
[textStorage removeAttribute: NSFontAttributeName
range: range];
[textStorage addAttribute: NSFontAttributeName
value: newFont
range: range];
}
}];
[textStorage endEditing];
它总是在最后一行崩溃,[textStorage endEditing];
。我已启用异常断点,但调试窗格中没有其他信息请参阅下面的回溯。如果我删除 'beginEditing
和 endEditing
,它会在 removeAttribute
行崩溃。我在我的整个应用程序中使用 [UIFont fontWithDescriptor: [UIFontDescriptor preferredFixedFontDescriptorWithTextStyle: IDFontTextStyleFixed] size: 0.0f];
,它在任何地方都有效,除了 UITextView
.
有人看到出了什么问题以及我该如何解决吗?
编辑:这是回溯:
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=2, address=0x10f3c0060)
frame #0: 0x000000010c77f29d libobjc.A.dylib`realizeClass(objc_class*) + 145
frame #1: 0x000000010c783125 libobjc.A.dylib`lookUpImpOrForward + 127
frame #2: 0x000000010c792554 libobjc.A.dylib`_objc_msgSend_uncached + 68
frame #3: 0x0000000118d39ce7 UIFoundation`-[NSGlyphGenerator generateGlyphsForGlyphStorage:desiredNumberOfCharacters:glyphIndex:characterIndex:] + 251
frame #4: 0x0000000118d06d47 UIFoundation`-[NSLayoutManager(NSPrivate) _fillGlyphHoleForCharacterRange:startGlyphIndex:desiredNumberOfCharacters:] + 736
frame #5: 0x0000000118d091b0 UIFoundation`_NSFastFillAllGlyphHolesForCharacterRange + 726
frame #6: 0x0000000118d47f2e UIFoundation`-[NSLayoutManager glyphRangeForCharacterRange:actualCharacterRange:] + 64
frame #7: 0x0000000118d071af UIFoundation`-[NSLayoutManager(NSPrivate) _fillLayoutHoleForCharacterRange:desiredNumberOfLines:isSoft:] + 617
frame #8: 0x0000000118d08e9a UIFoundation`-[NSLayoutManager(NSPrivate) _fillLayoutHoleAtIndex:desiredNumberOfLines:] + 208
frame #9: 0x0000000118d0954a UIFoundation`-[NSLayoutManager(NSPrivate) _markSelfAsDirtyForBackgroundLayout:] + 325
frame #10: 0x0000000118d13d10 UIFoundation`-[NSLayoutManager(NSPrivate) _invalidateLayoutForExtendedCharacterRange:isSoft:invalidateUsage:] + 2212
frame #11: 0x0000000118d44743 UIFoundation`-[NSLayoutManager textStorage:edited:range:changeInLength:invalidatedRange:] + 226
frame #12: 0x0000000118d448f9 UIFoundation`-[NSLayoutManager processEditingForTextStorage:edited:range:changeInLength:invalidatedRange:] + 47
frame #13: 0x0000000118d6c216 UIFoundation`-[NSTextStorage _notifyEdited:range:changeInLength:invalidatedRange:] + 168
frame #14: 0x0000000118d6bd4c UIFoundation`-[NSTextStorage processEditing] + 372
frame #15: 0x0000000118d6b995 UIFoundation`-[NSTextStorage endEditing] + 83
* frame #16: 0x000000010bee435b MyApp`-[MyUITextView updateFonts](self=0x00007fc26208c000, _cmd="updateFonts") at MyUITextView.m:107
好的,我解决了
我正在使用助手 class 来处理 NSTextStorage
、NSTextContainer
和 NSLayoutManager
对象。在创建MyTextView
时,我没有坚持helper对象(我只将textContainer
传递给了MyTextView
的init
。我现在将辅助对象设为 MyTextView
的 @property
,因此它具有很强的引用,并且崩溃消失了。
我的UITextView
响应UIContentSizeCategoryDidChangeNotification
响应动态字体变化,我实现了如下代码:
NSTextStorage * textStorage = [self textStorage];
[textStorage beginEditing];
[textStorage enumerateAttribute: NSFontAttributeName
inRange: NSMakeRange(0, [textStorage length])
options: 0
usingBlock: ^(id value, NSRange range, BOOL * stop) {
UIFont *newFont = [UIFont fontWithDescriptor: [UIFontDescriptor preferredFixedFontDescriptorWithTextStyle: IDFontTextStyleFixed] size: 0.0f];
if (newFont) {
[textStorage removeAttribute: NSFontAttributeName
range: range];
[textStorage addAttribute: NSFontAttributeName
value: newFont
range: range];
}
}];
[textStorage endEditing];
它总是在最后一行崩溃,[textStorage endEditing];
。我已启用异常断点,但调试窗格中没有其他信息请参阅下面的回溯。如果我删除 'beginEditing
和 endEditing
,它会在 removeAttribute
行崩溃。我在我的整个应用程序中使用 [UIFont fontWithDescriptor: [UIFontDescriptor preferredFixedFontDescriptorWithTextStyle: IDFontTextStyleFixed] size: 0.0f];
,它在任何地方都有效,除了 UITextView
.
有人看到出了什么问题以及我该如何解决吗?
编辑:这是回溯:
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=2, address=0x10f3c0060)
frame #0: 0x000000010c77f29d libobjc.A.dylib`realizeClass(objc_class*) + 145
frame #1: 0x000000010c783125 libobjc.A.dylib`lookUpImpOrForward + 127
frame #2: 0x000000010c792554 libobjc.A.dylib`_objc_msgSend_uncached + 68
frame #3: 0x0000000118d39ce7 UIFoundation`-[NSGlyphGenerator generateGlyphsForGlyphStorage:desiredNumberOfCharacters:glyphIndex:characterIndex:] + 251
frame #4: 0x0000000118d06d47 UIFoundation`-[NSLayoutManager(NSPrivate) _fillGlyphHoleForCharacterRange:startGlyphIndex:desiredNumberOfCharacters:] + 736
frame #5: 0x0000000118d091b0 UIFoundation`_NSFastFillAllGlyphHolesForCharacterRange + 726
frame #6: 0x0000000118d47f2e UIFoundation`-[NSLayoutManager glyphRangeForCharacterRange:actualCharacterRange:] + 64
frame #7: 0x0000000118d071af UIFoundation`-[NSLayoutManager(NSPrivate) _fillLayoutHoleForCharacterRange:desiredNumberOfLines:isSoft:] + 617
frame #8: 0x0000000118d08e9a UIFoundation`-[NSLayoutManager(NSPrivate) _fillLayoutHoleAtIndex:desiredNumberOfLines:] + 208
frame #9: 0x0000000118d0954a UIFoundation`-[NSLayoutManager(NSPrivate) _markSelfAsDirtyForBackgroundLayout:] + 325
frame #10: 0x0000000118d13d10 UIFoundation`-[NSLayoutManager(NSPrivate) _invalidateLayoutForExtendedCharacterRange:isSoft:invalidateUsage:] + 2212
frame #11: 0x0000000118d44743 UIFoundation`-[NSLayoutManager textStorage:edited:range:changeInLength:invalidatedRange:] + 226
frame #12: 0x0000000118d448f9 UIFoundation`-[NSLayoutManager processEditingForTextStorage:edited:range:changeInLength:invalidatedRange:] + 47
frame #13: 0x0000000118d6c216 UIFoundation`-[NSTextStorage _notifyEdited:range:changeInLength:invalidatedRange:] + 168
frame #14: 0x0000000118d6bd4c UIFoundation`-[NSTextStorage processEditing] + 372
frame #15: 0x0000000118d6b995 UIFoundation`-[NSTextStorage endEditing] + 83
* frame #16: 0x000000010bee435b MyApp`-[MyUITextView updateFonts](self=0x00007fc26208c000, _cmd="updateFonts") at MyUITextView.m:107
好的,我解决了
我正在使用助手 class 来处理 NSTextStorage
、NSTextContainer
和 NSLayoutManager
对象。在创建MyTextView
时,我没有坚持helper对象(我只将textContainer
传递给了MyTextView
的init
。我现在将辅助对象设为 MyTextView
的 @property
,因此它具有很强的引用,并且崩溃消失了。