iOS App NSInvalidArgumentException

时间:2013-01-04 19:07:54

标签: objective-c ios uitextview

我一直在尝试在我的iOS应用程序中使用rangeOfString处理一个bug很多个小时,并且最终能够找到我的应用程序崩溃的位置。我的应用程序将TextViewA设置为MainTextView的前半部分。应该添加如何添加语句以检查是否为空?

*** 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:; layer =; contentOffset:{0,0} > 2013-01-04 14:30:58.139输入[7279:c07] mainTextView.text:TESTTTTTTTT f f。

2013-01-04 14:30:58.142类型[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:terminate调用抛出异常 (gdb)

2 个答案:

答案 0 :(得分:1)

这个oneliner在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为空(或者如果您使用的是XIB文件,则它未正确连接到IBOutlet)。

你可以通过添加(在破折线之前的某个地方)检查:

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

答案 1 :(得分: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]];
}