我的一些用户正在崩溃.

据我所知,这与某些子类的NSTextView的-drawRect:方法连接起来,但是我看不到可能会导致什么,压力测试未能摆脱错误.

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
)

解决方法

*由于未被捕获的异常’NSRangeException’终止应用程序,原因:’*

[NSConcreteTextStorage attribute:atIndex:longestEffectiveRange:inRange:]: Range or index out of bounds’

这显然是一个NSRange异常,正如O’y所说

objective-c – drawRect中的崩溃 – 是什么原因?的更多相关文章

  1. 详解Canvas实用库Fabric.js使用手册

    这篇文章主要介绍了详解Canvas实用库Fabric.js使用手册的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. 【HTML5】3D模型--百行代码实现旋转立体魔方实例

    本篇文章主要介绍【HTML5】3D模型--百行代码实现旋转立体魔方实例,具有一定的参考价值,有需要的可以了解一下。

  3. H5 canvas实现贪吃蛇小游戏

    本篇文章主要介绍了H5 canvas实现贪吃蛇小游戏,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. ios – 异常断点处于活动状态时,应用程序在启动时崩溃

    我刚开始继续开发一款适用于商店的传统iPad应用程序.我注意到项目中的异常断点未启用.当我启用它时,应用程序在启动时崩溃,但在输出窗口中没有给出任何信息,而在线程视图中只有相当无用的信息(见下文)我试着解决它..>将Autolayout设置为关闭.>通过编辑和重新保存故事板文件..但到目前为止没有运气.我的猜测是,故事板中的某些内容被破坏了,因为AppDelegates“确实完成了启动……”

  5. ios – 如何更改UINavigationBar底部边框的颜色?

    我阅读了许多主题,但没有一个在最新版本的Swift的清晰,一致的答案中解决了这个问题.例如,thisquestion的最佳答案表明UINavigationBar.appearance().setShadowImage().但是,最新版本的swift中不存在这样的方法.我不想隐藏底部边框.我只是想改变颜色.另外,能够改变高度会很棒,但我知道我在一个问题上问得太多了.编辑:我创建了一个2×1像素图像并

  6. ios – Swift 4添加手势:覆盖vs @objc

    我想在我的视图中添加一个手势,如下所示:但是,在Swift4中,我的编译器给出了以下错误:建议添加@objc以将此实例方法公开给Objective-C.实现此目的的另一个选项将覆盖touchesBegan()函数并使用它来处理点击.我试图以“Swift”的方式做到这一点,而不必带入Obj-C.有没有纯粹的Swift方式来添加这个轻击手势而不使用@objc?

  7. ios – Objective-C中“and”关键字的含义是什么?

    我在Xcode中输入了一条评论,但忘了领先//.我注意到了这一点并且突出显示为关键字.我做了一些谷歌搜索,但我似乎无法弄清楚它做了什么.这是什么意思?解决方法它是&&的同义词.见iso646.h.

  8. ios – 以编程方式在Swift中添加联系人

    我想在Swift中以编程方式添加联系人.我发现了一些Objective-C示例,但我没有让它们工作,甚至在Objective-C中也没有.我不希望这涉及到AddressBookUI,因为我想从我自己的UI中获取值.解决方法这是在Swift中添加联系人的快速方法.我在我的iPhone5iOS7.1上验证了它,因为我发现模拟器并不总是与我的手机对AB的东西相同.您可以添加一个按钮并指向此方法:顺便说一下–它假设你已经分配了一个地址簿var,你可以通过覆盖viewDidAppear来打开视图.它也会执行安全提示

  9. ios – Objective-C中的Google用户serverAuthCode nil

    我正在尝试将GoogleSignIn框架集成到iOS应用程序中,并对服务器上的用户进行身份验证.我设法登录用户,但在–(void)signIn:(GIDSignIn*)signIndidSignInForUser:(GIDGoogleUser*)用户withError:(NSError*)错误委托方法,user.serverAuthCode为nil,我需要通过此服务器身份验证代码,嗯,验证服务器上

  10. ios – sizeToFit削减了一些UILabel字体类型的高度和宽度但不是其他 – 是否有修复?

    我正在使用自定义字体,我有一点障碍.有些字体可以正常使用sizetoFit,如下所示:但是,其他自定义字体在左侧和底部被截断,因为这是:我可以“破解”它,只检查每种字体类型并添加几个像素,但我想知道是否有更清晰的解决方案,甚至解释为什么会发生这种情况.谢谢!

随机推荐

  1. 从C到C#的zlib(如何将byte []转换为流并将流转换为byte [])

    我的任务是使用zlib解压缩数据包(已接收),然后使用算法从数据中生成图片好消息是我在C中有代码,但任务是在C#中完成C我正在尝试使用zlib.NET,但所有演示都有该代码进行解压缩(C#)我的问题:我不想在解压缩后保存文件,因为我必须使用C代码中显示的算法.如何将byte[]数组转换为类似于C#zlib代码中的流来解压缩数据然后如何将流转换回字节数组?

  2. 为什么C标准使用不确定的变量未定义?

    垃圾价值存储在哪里,为什么目的?解决方法由于效率原因,C选择不将变量初始化为某些自动值.为了初始化这些数据,必须添加指令.以下是一个例子:产生:虽然这段代码:产生:你可以看到,一个完整的额外的指令用来移动1到x.这对于嵌入式系统来说至关重要.

  3. 如何使用命名管道从c调用WCF方法?

    更新:通过协议here,我无法弄清楚未知的信封记录.我在网上找不到任何例子.原版的:我有以下WCF服务我输出添加5行,所以我知道服务器是否处理了请求与否.我有一个.NET客户端,我曾经测试这一切,一切正常工作预期.现在我想为这个做一个非托管的C客户端.我想出了如何得到管道的名称,并写信给它.我从here下载了协议我可以写信给管道,但我看不懂.每当我尝试读取它,我得到一个ERROR_broKEN_P

  4. “这”是否保证指向C中的对象的开始?

    我想使用fwrite将一个对象写入顺序文件.班级就像当我将一个对象写入文件时.我正在游荡,我可以使用fwrite(this,sizeof(int),2,fo)写入前两个整数.问题是:这是否保证指向对象数据的开始,即使对象的最开始可能存在虚拟表.所以上面的操作是安全的.解决方法这提供了对象的地址,这不一定是第一个成员的地址.唯一的例外是所谓的标准布局类型.从C11标准:(9.2/20)Apointe

  5. c – 编译单元之间共享的全局const对象

    当我声明并初始化一个const对象时.两个cpp文件包含此标头.和当我构建解决方案时,没有链接错误,你会得到什么如果g_Const是一个非const基本类型!PrintInUnit1()和PrintInUnit2()表明在两个编译单元中有两个独立的“g_Const”具有不同的地址,为什么?

  6. 什么是C名称查找在这里? (&GCC对吗?)

    为什么在第三个变体找到func,但是在实例化的时候,原始变体中不合格查找找不到func?解决方法一般规则是,任何不在模板定义上下文中的内容只能通过ADL来获取.换句话说,正常的不合格查找仅在模板定义上下文中执行.因为在定义中间语句时没有声明func,并且func不在与ns::type相关联的命名空间中,所以代码形式不正确.

  7. c – 在输出参数中使用auto

    有没有办法在这种情况下使用auto关键字:当然,不可能知道什么类型的.因此,解决方案应该是以某种方式将它们合并为一个句子.这可用吗?解决方法看起来您希望默认初始化给定函数期望作为参数的类型的对象.您无法使用auto执行此操作,但您可以编写一个特征来提取函数所需的类型,然后使用它来声明您的变量:然后你就像这样使用它:当然,只要你重载函数,这一切都会失败.

  8. 在C中说“推动一切浮动”的确定性方式

    鉴于我更喜欢将程序中的数字保留为int或任何内容,那么使用这些数字的浮点数等效的任意算术最方便的方法是什么?说,我有我想写通过将转换放在解析的运算符树叶中,无需将表达式转化为混乱是否可以使用C风格的宏?应该用新的类和重载操作符完成吗?解决方法这是一个非常复杂的表达.更好地给它一个名字:现在当您使用整数参数调用它时,由于参数的类型为double,因此使用常规的算术转换将参数转换为double用C11lambda……

  9. objective-c – 如何获取未知大小的NSArray的第一个X元素?

    在objectiveC中,我有一个NSArray,我们称之为NSArray*largeArray,我想要获得一个新的NSArray*smallArray,只有第一个x对象…

  10. c – Setprecision是混乱

    我只是想问一下setprecision,因为我有点困惑.这里是代码:其中x=以下:方程的左边是x的值.1.105=1.10应为1.111.115=1.11应为1.121.125=1.12应为1.131.135=1.14是正确的1.145=1.15也正确但如果x是:2.115=2.12是正确的2.125=2.12应为2.13所以为什么在一定的价值是正确的,但有时是错误的?请启发我谢谢解决方法没有理由期望使用浮点系统可以正确地表示您的帖子中的任何常量.因此,一旦将它们存储在一个双变量中,那么你所拥有的确切的一

返回
顶部