0

我一直在尝试解决我的 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] 分隔符:(空)

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

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

*首先抛出调用栈:

(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)

4

2 回答 2

1

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

尝试打破:

[[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是 null (或者如果你使用的是 XIB 文件,它没有正确连接到IBOutlet)。

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

NSLog (@"myViewController.tvTextMiddle: %@", myViewController.tvTextMiddle);
于 2013-01-04T19:18:00.933 回答
0

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

所以添加一个条件,如:

if(mainTextView.text.length != 0 && [myViewController tvTextMiddle]text].length != 0)
{
  [[myViewController tvTextFirstHalf] setText:[[mainTextView.text componentsSeparatedByString:[[myViewController tvTextMiddle]text]] objectAtIndex:0]];
}
于 2013-01-04T19:15:09.383 回答