我一直在尝试解决我的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 Type [7279:c07] mainTextView:;层=; contentOffset:{0,0}
>
2013-01-04 14:30:58.139类型[7279:c07] mainTextView.text:TESTTTTTTTT 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 0x1x1x2x0x2x0x2x0x2a 0x1a2b1 0x1a2b2 0x1a2b2 0x1a2b2 0x1a2b2 0x1a2b2 0x1a2b2 0x1b2b 0x1a2b2 0x1a2b1 0x1b0b 0x1a2b1 0x1b0b 0x1a2b1 0x1b0b 0x1a2b1 0x1b0b 0x1a2b1 0x1b0b 0x1a2b1 0b 0x1b2b 0x1a2b1 0b 0x1b0b 0x1b2b 0x1b2b 0x1b2b 0b

libc ++ abi.dylib:终止调用引发异常
(gdb)

最佳答案

在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);

10-06 02:43