gpt4 book ai didi

objective-c - iOS 应用程序 NSInvalidArgumentException

转载 作者:行者123 更新时间:2023-11-29 04:12:52 25 4
gpt4 key购买 nike

我花了好几个小时试图解决我的 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: ;层=;内容偏移: {0, 0}>2013-01-04 14:30:58.139 类型[7279:c07] mainTextView.text: TESTTTTTTTT f f.

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

* 第一个抛出调用堆栈:

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

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

最佳答案

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

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

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

关于objective-c - iOS 应用程序 NSInvalidArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14163308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com