【问题标题】:iOS App NSInvalidArgumentExceptioniOS 应用程序 NSInvalidArgumentException
【发布时间】:2013-01-05 16:13:22
【问题描述】:

我一直在尝试解决我的 iOS 应用程序中涉及 rangeOfString 的错误数小时,终于能够追踪我的应用程序崩溃的位置。我的应用程序将 TextViewA 设置为 MainTextView 的前半部分。应该添加什么if语句来检查nil?

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSCFString rangeOfString:options:range:locale:]: nil argument'
*** First throw call stack:

.

[[myViewController tvTextFirstHalf] setText:[[mainTextView.text componentsSeparatedByString:[[myViewController tvTextMiddle]text]] objectAtIndex:0]];

.................................................. ................................................

现在没有可用于编程的内存:调用 malloc 不安全

2013-01-04 14:30:58.138 类型[7279:c07] 分隔符:(null)

2013-01-04 14:30:58.138 类型[7279:c07] mainTextView: ;层 = ;内容偏移:{0, 0} > 2013-01-04 14:30:58.139 类型[7279:c07] mainTextView.text: TESTTTTTTT f f.

2013-01-04 14:30:58.142 Type[7279:c07] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“* -[__NSCFString rangeOfString:options:range: locale:]: nil 参数'

* 首先抛出调用栈:

(0x1a5d012 0x1882e7e 0x1a5cdeb 0xf78688 0xf87d88 0xfd05df 0x165ec 0x15dc6 0x1fd7b 0x56d8d5 0x56db3d 0xf74e83 0x1a1c376 0x1a1be06 0x1a03a82 0x1a02f44 0x1a02e1b 0x221d7e3 0x221d668 0x4be65c 0x2c5d 0x2b85)

libc++abi.dylib:终止调用抛出异常 (gdb)

【问题讨论】:

    标签: objective-c ios uitextview


    【解决方案1】:

    在 obj-C 中,这个 oneliners 不被认为是一个好的做法(我知道,这是有争议的)。

    尝试打破:

    [[myViewController tvTextFirstHalf] setText:[[mainTextView.text componentsSeparatedByString:[[myViewController tvTextMiddle]text]] objectAtIndex:0]];
    

    进入一些对调试更友好的代码:

    NSString *separator = [[myViewController tvTextMiddle]text];
    
    NSLog (@"separator: %@", separator);
    NSLog (@"mainTextView: %@",mainTextView);   //is this one nil?
    NSLog (@"myViewController.tvTextMiddle: %@", myViewController.tvTextMiddle); //what about this one??
    NSLog (@"mainTextView.text: %@",mainTextView.text);
    
    NSArray *components = [mainTextView.text componentsSeparatedByString:separator];
    
    NSLog (@"we found %d components", components.count);
    
    NSString *result = (NSString *)[components objectAtIndex:0];
    
    NSLog (@"result should be: %@", result);
    
    [[myViewController tvTextFirstHalf] setText:result];
    

    代码当然会出错,但至少你会知道问题出在哪里。

    你可以改变最后四行,然后像这样:

    if (components.count >= 1)
    {
        NSString *result = (NSString *)[components objectAtIndex:0];
        NSLog (@"result should be: %@", result);
        [[myViewController tvTextFirstHalf] setText:result];    
    }
    else
    {
        [[myViewController tvTextFirstHalf] setText:@"empty!"];
    }
    

    编辑:

    从您发布的NSLog 中,很明显您的分隔符[[myViewController tvTextMiddle]text] 为空。请注意,null 与空字符串不同。它是未分配的字符串。

    我的猜测是,实际上您的 tvTextMiddle 为空(或者如果您使用的是 XIB 文件,则它没有正确连接到 IBOutlet)。

    您可以通过添加(在断线之前的某处)来检查:

    NSLog (@"myViewController.tvTextMiddle: %@", myViewController.tvTextMiddle);
    

    【讨论】:

    • 它在:[mainTextView.text componentsSeparatedByString:separator];
    • 该行之前的行的 NSLog 打印输出是什么?
    • 仍然在 NSArray *components = [mainTextView.text componentsSeparatedByString:separator] 处崩溃;
    • 是的,但是您在调试控制台中得到了什么打印输出?这可以查明问题的确切根源。
    • 请查看编辑后的答案:我很确定您的 myViewController.tvTextMiddle 连接不正确
    【解决方案2】:

    崩溃是由于此调用componentsSeparatedByString 造成的。 如果您的 textview 为 nil 或没有文本,则会发生崩溃。

    所以添加一个类似的条件:

    if(mainTextView.text.length != 0 && [myViewController tvTextMiddle]text].length != 0)
    {
      [[myViewController tvTextFirstHalf] setText:[[mainTextView.text componentsSeparatedByString:[[myViewController tvTextMiddle]text]] objectAtIndex:0]];
    }
    

    【讨论】:

    • 它通过了那里,但是类似的作品呢? [[myViewController tvTextSecondHalf] setText:[[[mainTextView text] componentsSeparatedByString:[[myViewController tvTextMiddle]text]] objectAtIndex:1]];
    • @BDGapps:表示它还在崩溃?
    • 它在以下 2 行崩溃:[[myViewController tvTextSecondHalf] setText:[[[mainTextView text] componentsSeparatedByString:[[myViewController tvTextMiddle]text]] objectAtIndex:1]]
    • @BDGapps:使用相同的 if 条件来更改参数
    猜你喜欢
    • 2013-02-03
    • 2012-05-28
    • 1970-01-01
    • 2015-09-21
    • 2019-03-23
    • 2012-10-25
    • 1970-01-01
    • 2016-05-24
    相关资源
    最近更新 更多