我一直在尝试在我的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)
答案 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]];
}