2013-11-20 3 views
0

В моем приложении используется мой собственный подкласс NSTextStorage, и все работает отлично до Mavericks. Даже с самой урезанной версией, я получаю исключение, как только я начинаю с него текстовое представление. Я прочитал документацию, а также посмотрел на How to extend NSTextStorage?. Надеюсь, один из вас знает, что Apple что-то изменила, или если я что-то делаю неправильно.Исключение, связанное с диапазоном при подклассе NSTextStorage на Mavericks

информация вам, вероятно, нужно, чтобы помочь мне:

исключение:

TextViewCheck [12542: 303]: Исключение *** NSRunStorage (0x6000000a4200), _replaceElements(): заменить диапазон {0, 929} расширяет за пределами текущего размера хранилища 928., поднятый во время управления компоновкой верстки NSLayoutManager: 0x100106a80
1 контейнер, текст backin g имеет 928 символов выбранный диапазон символов {0, 0} близость: зернистость вверх: символ обозначенный диапазон символов {0, 0} В настоящее время имеется 928 глифов.
Содержание дерева глифов: 928 символов, 928 глифов, 1 узел, 64 узла байтов, 960 байты хранения, 1024 байта, 1.10 байт на символ, 1.10 байт на глиф Содержимое дерева компоновки: 928 символов, 928 глифов, глифов, 0 уложенных линий фрагментов, 1 узел, 64 байта узла, 0 байтов хранения, 64 байта общего объема, 0.07 байт на символ, 0,07 байт на глиф, 0.00 наложенных глифов на уложенный фрагмент строки, 0.00 байт на отложенный фрагмент строки , диапазон глифов {0 928}. Игнорирование ...

трассировку

thread #1: tid = 0x137013, 0x00007fff8ad7e44e AppKit`_NSGlyphTreeGetGlyphsInRange + 1179, queue = 'com.apple.main-thread, stop reason = EXC_BAD_ACCESS (code=1, address=0x1002c0000) 

frame #0: 0x00007fff8ad7e44e AppKit`_NSGlyphTreeGetGlyphsInRange + 1179 
frame #1: 0x00007fff8ad7dfa1 AppKit`-[NSLayoutManager getGlyphsInRange:glyphs:characterIndexes:glyphInscriptions:elasticBits:bidiLevels:] + 92 
frame #2: 0x00007fff8ad4d8b6 AppKit`-[NSATSGlyphStorage setGlyphRange:characterRange:] + 3724 
frame #3: 0x00007fff8ad4c8be AppKit`-[NSATSTypesetter _ctTypesetter] + 306 
frame #4: 0x00007fff8ad4baf9 AppKit`-[NSATSLineFragment layoutForStartingGlyphAtIndex:characterIndex:minPosition:maxPosition:lineFragmentRect:] + 85 
frame #5: 0x00007fff8ad4a64e AppKit`-[NSATSTypesetter _layoutLineFragmentStartingWithGlyphAtIndex:characterIndex:atPoint:renderingContext:] + 2777 
frame #6: 0x00007fff8ad7dc79 AppKit`-[NSATSTypesetter layoutParagraphAtPoint:] + 149 
frame #7: 0x00007fff8b3f5b45 AppKit`-[NSTypesetter _layoutGlyphsInLayoutManager:startingAtGlyphIndex:maxNumberOfLineFragments:maxCharacterIndex:nextGlyphIndex:nextCharacterIndex:] + 4043 
frame #8: 0x00007fff8ad7cc9d AppKit`-[NSTypesetter layoutCharactersInRange:forLayoutManager:maximumNumberOfLineFragments:] + 202 
frame #9: 0x00007fff8ad7cb81 AppKit`-[NSATSTypesetter layoutCharactersInRange:forLayoutManager:maximumNumberOfLineFragments:] + 1107 
frame #10: 0x00007fff8ad7b219 AppKit`-[NSLayoutManager(NSPrivate) _fillLayoutHoleForCharacterRange:desiredNumberOfLines:isSoft:] + 1306 
frame #11: 0x00007fff8ae24ad9 AppKit`_NSFastFillAllLayoutHolesForGlyphRange + 1435 
frame #12: 0x00007fff8ae6ddbd AppKit`-[NSLayoutManager(NSPrivate) _firstPassGlyphRangeForBoundingRect:inTextContainer:okToFillHoles:] + 309 
frame #13: 0x00007fff8ae6cea4 AppKit`-[NSLayoutManager(NSPrivate) _glyphRangeForBoundingRect:inTextContainer:fast:okToFillHoles:] + 875 
frame #14: 0x00007fff8add81b2 AppKit`-[NSTextView setNeedsDisplayInRect:avoidAdditionalLayout:] + 1466 
frame #15: 0x00007fff8acb4222 AppKit`-[NSView setNeedsDisplay:] + 81 
frame #16: 0x00007fff8add68d9 AppKit`-[NSTextView setTextContainer:] + 699 
frame #17: 0x00007fff8add651a AppKit`-[NSTextContainer setTextView:] + 263 
... 

код:

TTTSimpleTextStorage.m

@implementation TTTSimpleTextStorage 

- (id)initWithAttributedString:(NSAttributedString *)attrStr { 
    if (self = [super init]) { 
     contents = attrStr ? [attrStr mutableCopy] : 
     [[NSMutableAttributedString alloc] init]; 
    } 
    return self; 
} 


- init { 
    return [self initWithAttributedString:nil]; 
} 

- (NSString *)string { 
    return [contents string]; 
} 

- (NSDictionary *)attributesAtIndex:(NSUInteger)location 
       effectiveRange:(NSRange *)range { 
    return [contents attributesAtIndex:location effectiveRange:range]; 
} 

- (void)replaceCharactersInRange:(NSRange)range withString:(NSString 
                 *)str { 
    NSInteger origLen = [self length]; 
    [contents replaceCharactersInRange:range withString:str]; 
    [self edited:NSTextStorageEditedCharacters range:range 
      changeInLength:[self length] - origLen]; 
} 

- (void)setAttributes:(NSDictionary *)attrs range:(NSRange)range { 
    [contents setAttributes:attrs range:range]; 
    [self edited:NSTextStorageEditedCharacters range:range 
     changeInLength:0]; 
} 

@end 

Как я использую его

Это в MainWindowController - awakeFromNib, окно IBOutlet имеет NSView, как подвид имя контейнера и случайная строка string1

nts1 = [[TTTSimpleTextStorage alloc] initWithString:string1]; 

NSLayoutManager* lm1 = [[NSLayoutManager alloc] init]; 
[nts1 addLayoutManager:lm1]; 

NSTextContainer* tc1 = [[NSTextContainer alloc] initWithContainerSize:NSMakeSize(400, 280)]; 
[lm1 addTextContainer:tc1]; 


tv1 = [[NSTextView alloc] initWithFrame:NSMakeRect(40, 20, 400, 280) textContainer:tc1]; // here it crashes 

[self.container addSubview:tv1]; 
[self.window makeKeyAndOrderFront:nil]; 
[self.window makeFirstResponder:tv1]; 
+1

Это похоже на ошибку за один раз в одном из диапазонов. –

+0

@BradAllred: правильно, но я не знаю, где я создаю эту ошибку или как могу ее решить. видимо, строка, которую я использую, имеет 928 символов, и до тех пор пока это не приведет к сбою только методов - (id) init ..., - (NSString *) string и - (NSDictionary *) attributesAtIndex ... get вызываются. и в атрибутахAtIndex диапазон (928,0) –

+1

закомментируйте все ваши переопределения, кроме первого, и запустите его. если он не сработает, добавьте следующий метод и повторите, пока не найдете виновника. мои деньги находятся на 'replaceCharactersInRange' –

ответ

0

В replaceCharactersInRange, вы устанавливаете origLen на [длина самостоятельной длины] и на одну строку позже вы вычисляете значение переменной InLength путем вычитания origLen с [собственной длиной], которая эффективно:

NSInteger origLen = self.length; 
// ... 
changeInLength: origLen - self.length 

Я думаю, что вы скорее всего хотите:

changeInLength: self.length - str.length]; 
+0

Эй, я попробовал, но это не поможет. Тем временем я написал поддержку Apple, и они считают, что это ошибка где-то в Framework. Я сообщу об ошибке в своем трекере ошибок. Мое обходное решение заключается в том, чтобы не заменить «TextStorage», а заменить его «String». –

Смежные вопросы