2017-04-01 98 views
0

UITextView响应时UIContentSizeCategoryDidChangeNotification应对动态字体的变化,我实现了下面的代码:崩溃更新NSTextStorage字体

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];。我已启用异常断点 ,但在调试窗格 中没有附加信息,请参阅下面的回溯。如果我删除'beginEditingendEditing,它会在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 
+0

它与什么崩溃?控制台中没有记录? –

+0

什么也没有,但我刚刚添加了回溯。 – Koen

回答

0

OK,我解决了这个问题。

我正在使用助手类来处理NSTextStorageNSTextContainerNSLayoutManager对象。当创建MyTextView时,我没有坚持帮助对象(我只通过了textContainerinitMyTextView)。我现在帮助对象MyTextView@property,所以它有一个很强的参考,并且崩溃消失了。