English 中文(简体)
绘图崩溃 - 是什么原因?
原标题:Crash in drawRect - what causes it?

我的一些用户正在得到这次坠机。

据我所知,它在某种程度上与我分类的子分类 NSTextView 方法的 -drawRect: 方法有连接,但我看不出是什么原因,压力测试未能消除错误。

代码绘图矩形的代码

- (NSRange)visibleRangeOfTextView:(NSRect) rect {
    NSLayoutManager *layoutManager = [self
                                      layoutManager];
    NSTextContainer *textContainer = [self
                                      textContainer];
    NSRange glyphRange, characterRange;
    // first transform to text container coordinates
    NSPoint containerOrigin = [self textContainerOrigin];
    rect.origin.x -= containerOrigin.x;
    rect.origin.y -= containerOrigin.y;

    // next, compute glyph range
    glyphRange = [layoutManager glyphRangeForBoundingRect:rect inTextContainer:textContainer];

    // finally, compute character range
    characterRange = [layoutManager characterRangeForGlyphRange:glyphRange actualGlyphRange:NULL];
    return characterRange;
}

- (NSRect)rectForCharacterRange:(NSRange)charRange
{
    NSRect rect = [self
                   firstRectForCharacterRange:charRange];
    rect.origin = [[self window]
                   convertScreenToBase:rect.origin];
    rect = [self convertRect:rect fromView:nil];
    if (!rect.size.width) rect.size.width = 6.0;
    return rect;
}

- (void)drawRect:(NSRect)dirtyRect
{
    [super drawRect:dirtyRect];
    NSLog(@"Marking it");
    NSMutableArray *arr = [[NSMutableArray alloc] init];
    NSRange visible = [self visibleRangeOfTextView:dirtyRect];
    NSRange last = NSMakeRange(visible.location, 0);    while (true) {
        NSRange error = [appController rangeOfMisspelledWordInString:self.string onlyInRange:visible startingAt:last.location + last.length];
        last = error;
        if (error.location == NSNotFound) {
            break;
        }
        [arr addObject:[NSValue valueWithRange:error]];
    }

    NSLog(@"Spellchecked");

    [[NSColor redColor] setStroke];
    CGFloat dash[] = {2.0f, 2.0f} ;
    // Make the text ranges and mark them
    for (NSValue *val in arr) {
        NSRange range = [val rangeValue]; 
        NSRect rectInTextView = [self rectForCharacterRange:range];
        NSRect toDraw = rectInTextView;
        NSBezierPath*    aPath = [NSBezierPath bezierPath];
        [aPath setLineDash:dash count:2 phase:0];

        NSPoint lineStart = toDraw.origin;
        lineStart.y += toDraw.size.height;
        NSPoint lineEnd = lineStart;
        lineEnd.x += toDraw.size.width;

        [aPath moveToPoint:lineStart];
        [aPath lineToPoint:lineEnd];
        [aPath stroke];        
    };
    NSLog(@"Done");    
}

堆叠跟踪 :

Crashed Thread:  0  Dispatch queue: com.apple.main-thread

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000

Application Specific Information:
objc[5751]: garbage collection is ON
*** Terminating app due to uncaught exception  NSRangeException , reason:  *** -[NSConcreteTextStorage attribute:atIndex:longestEffectiveRange:inRange:]: Range or index out of bounds 
*** First throw call stack:
(
    0   CoreFoundation                      0x00007fff91387fc6 __exceptionPreprocess + 198
    1   libobjc.A.dylib                     0x00007fff8d4d7d5e objc_exception_throw + 43
    2   CoreFoundation                      0x00007fff91387dfa +[NSException raise:format:arguments:] + 106
    3   CoreFoundation                      0x00007fff91387d84 +[NSException raise:format:] + 116
    4   AppKit                              0x00000001005d842c -[NSConcreteTextStorage attribute:atIndex:longestEffectiveRange:inRange:] + 131
    5   AppKit                              0x00000001006288ec -[NSLayoutManager(NSPrivate) _drawBackgroundForGlyphRange:atPoint:parameters:] + 910
    6   AppKit                              0x00000001006277a2 -[NSTextView drawRect:] + 1913
    7   Skrivest√∏tte                       0x000000010000b56c Skrivest√∏tte + 46444
    8   AppKit                              0x0000000100626e66 -[NSTextView _drawRect:clip:] + 2545
    9   AppKit                              0x00000001004a985d -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] + 3020
    10  AppKit                              0x00000001004aa34e -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] + 5821
    11  AppKit                              0x00000001004aa34e -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] + 5821
    12  AppKit                              0x00000001004a39af -[NSView _displayRectIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:] + 4755
    13  AppKit                              0x000000010049c395 -[NSView displayIfNeeded] + 1528
    14  AppKit                              0x00000001004a1592 -[NSClipView _immediateScrollToPoint:] + 6533
    15  AppKit                              0x000000010049fb75 -[NSClipView scrollToPoint:] + 239
    16  AppKit                              0x000000010058f637 -[NSScrollView scrollClipView:toPoint:] + 266
    17  AppKit                              0x000000010058f3da -[NSClipView _scrollTo:animateScroll:flashScrollerKnobs:] + 1497
    18  AppKit                              0x00000001005923b7 -[NSClipView _scrollTo:animate:] + 27
    19  AppKit                              0x0000000100bcd5a2 __-[NSScrollView _snapRubberBand]_block_invoke_2 + 1536
    20  AppKit                              0x0000000100b3fc4e ____NSPeriodicInvokerScheduled_block_invoke_2 + 53
    21  libdispatch.dylib                   0x00007fff907b98ba _dispatch_call_block_and_release + 18
    22  libdispatch.dylib                   0x00007fff907bbc07 _dispatch_after_timer_callback + 16
    23  libdispatch.dylib                   0x00007fff907be2b6 _dispatch_source_invoke + 635
    24  libdispatch.dylib                   0x00007fff907baf77 _dispatch_queue_invoke + 71
    25  libdispatch.dylib                   0x00007fff907bb6f7 _dispatch_main_queue_callback_4CF + 257
    26  CoreFoundation                      0x00007fff9131d06c __CFRunLoopRun + 1724
    27  CoreFoundation                      0x00007fff9131c676 CFRunLoopRunSpecific + 230
    28  HIToolbox                           0x00007fff93ab831f RunCurrentEventLoopInMode + 277
    29  HIToolbox                           0x00007fff93abf5c9 ReceiveNextEventCommon + 355
    30  HIToolbox                           0x00007fff93abf456 BlockUntilNextEventMatchingListInMode + 62
    31  AppKit                              0x000000010045ff5d _DPSNextEvent + 659
    32  AppKit                              0x000000010045f861 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 135
    33  AppKit                              0x000000010045c19d -[NSApplication run] + 470
    34  AppKit                              0x00000001006dab88 NSApplicationMain + 867
    35  Skrivest√∏tte                       0x0000000100001020 Skrivest√∏tte + 4128
    36  ???                                 0x0000000000000002 0x0 + 2
)
问题回答

“强(强)+(强)-终止应用程序,因为未发现例外NSRange例外,原因:%/强”

[NSConcreteText 文本存储属性: atIndex: 最长久的有效Range: inRange:]: 范围或索引超出界限

正如O y 所说,这显然是NSRange的例外。

我认为你需要添加维护功能来检查“ 范围” 。

NSRange range = [val rangeValue];

确定区域不会是 NSNotFound





相关问题
2 mysql instances in MAC

i recently switched to mac. first and foremost i installed xampp. then for django-python-mysql connectivity, i "somehow" ended up installing a seperate MySQL. now the seperate mysql installation is ...

Iterating over string/strlen with umlauted characters

This is a follow-up to my previous question . I succeeded in implementing the algorithm for checking umlauted characters. The next problem comes from iterating over all characters in a string. I do ...

Controlling OSX windows

I m trying to control windows of a foreign OSX applications from my application. I d like to 1. move the windows on the screen 2. resize the windows on the screen 3. change the currently active window ...

Switching J2SE versions on Mac OS (SnowLeopard)

My current JDK on Mac OS (10.6) is set to 1.6 and I d like to switch to 1.5. A listing of /System/Library/Frameworks/JavaVM.framework/Versions/ shows: lrwxr-xr-x 1 root wheel 10 Nov 3 18:34 ...

Scrolling inside Vim in Mac s Terminal

I ve been googling around trying to figure out if it s possible to use my mouse wheel to scroll while inside Vim in Mac s Terminal, with no luck. It seems as if only X11 or iTerm support this. Before ...

export to MP3 from quicktime API

A question for Apple,QT programmers. Would like to know if it s possible to export a Movie object to MP3 using the QuickTime API. Preferably the ConvertMovieToFile function. I ve looked at ...

热门标签