Objective c 程序停止处理数组中过多的文件
我编写了这个搜索程序,用于搜索包含文件名和指向计算机上文件路径的对象数组。当我编写程序时,我有两个测试文件,它们与我的代码配合得非常好。然后我开始添加实际的文件,它可以处理10-20个文件,所以我决定再添加一些(大约45个,总共大约60个文件)。这是如果它出了问题;该程序运行,但我不能搜索任何文件,没有得到“线程1:信号SIGABRT”错误,就行了我的搜索功能是。我在控制台中也收到一条错误消息,但我恐怕无法理解。当我只有10个文件时,文件是否可搜索并不重要,当我使用所有文件时,它将停止工作。我将我的代码包括在下面: SMADoc.h(用于创建PDF对象的自定义类) 这是控制台中的输出:Objective c 程序停止处理数组中过多的文件,objective-c,if-statement,sigabrt,Objective C,If Statement,Sigabrt,我编写了这个搜索程序,用于搜索包含文件名和指向计算机上文件路径的对象数组。当我编写程序时,我有两个测试文件,它们与我的代码配合得非常好。然后我开始添加实际的文件,它可以处理10-20个文件,所以我决定再添加一些(大约45个,总共大约60个文件)。这是如果它出了问题;该程序运行,但我不能搜索任何文件,没有得到“线程1:信号SIGABRT”错误,就行了我的搜索功能是。我在控制台中也收到一条错误消息,但我恐怕无法理解。当我只有10个文件时,文件是否可搜索并不重要,当我使用所有文件时,它将停止工作。我将
2015-07-09 14:28:25.047 LIX4[3537:108937] message
2015-07-09 14:28:25.049 LIX4[3537:108937] Enter what you want to search for:
1177880000
2015-07-09 14:28:27.505 LIX4[3537:108937] Opening document...
2015-07-09 14:28:27.633 LIX4[3537:108937] An uncaught exception was raised
2015-07-09 14:28:27.633 LIX4[3537:108937] -[__NSCFNumber compare:]: nil argument
2015-07-09 14:28:27.633 LIX4[3537:108937] (
0 CoreFoundation 0x00007fff8b8ae03c __exceptionPreprocess + 172
1 libobjc.A.dylib 0x00007fff8ef9076e objc_exception_throw + 43
2 CoreFoundation 0x00007fff8b8adeed + [NSException raise:format:] + 205
3 CoreFoundation 0x00007fff8b7ab031 - [__NSCFNumber compare:] + 81
4 CoreFoundation 0x00007fff8b7aafc8 - [__NSCFNumber isEqualToNumber:] + 24
5 LIX4 0x0000000100004a3a documentSearch + 14490
6 LIX4 0x0000000100005355 main + 53
7 libdyld.dylib 0x00007fff8fb6f5c9 start + 1
)
2015-07-09 14:28:27.634 LIX4[3537:108937] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber compare:]: nil argument'
*** First throw call stack:
(
0 CoreFoundation 0x00007fff8b8ae03c __exceptionPreprocess + 172
1 libobjc.A.dylib 0x00007fff8ef9076e objc_exception_throw + 43
2 CoreFoundation 0x00007fff8b8adeed +[NSException raise:format:] + 205
3 CoreFoundation 0x00007fff8b7ab031 -[__NSCFNumber compare:] + 81
4 CoreFoundation 0x00007fff8b7aafc8 -[__NSCFNumber isEqualToNumber:] + 24
5 LIX4 0x0000000100004a3a documentSearch + 14490
6 LIX4 0x0000000100005355 main + 53
7 libdyld.dylib 0x00007fff8fb6f5c9 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
如果有人能帮我解决这个问题,我将非常感激 您的对象是否包含数字,我感觉
[nSearch docNumber]
必须为零,即它正在崩溃不是对您的问题的回答,而是指我们在关于无止境循环的评论中的对话。你的是递归的,永远不会结束。到时候,您将遇到堆栈溢出。 这是实现同样目标的正确方法:
int main(int argc, const char * argv[]) {
while (true) {
@autoreleasepool {
documentSearch();
}
}
return 0;
}
请注意,
@autoreleasepool
在循环中 我解决了!MacRumors的人帮我解决了我的问题!我打开了两个版本的程序;一个有60个文件不断崩溃,另一个有5个文件(我在这里发布的代码),并在
if ([sNumber isEqualToNumber:[nSearch docNumber]])
在两个版本中,然后检查变量,我发现了一些错误。我发现用户输入的sNumber
变量的值有时存储在double
中,而不是int
中,这就是问题所在!我通过使用变量number而不是sNumber(因为它已经是int)并替换以下代码来解决此问题:
if ([sNumber isEqualToNumber:[nSearch docNumber]]) {
[...]
if (![sNumber isEqualToNumber:[nSearch docNumber]]) {
为此:
if (number == [[nSearch docNumber] intValue]) {
[...]
(!(number == [[nSearch docNumber] intValue])) {
这就解决了问题
编辑:如果有人感兴趣,这里有一个指向MacRumors线程的链接:看起来您没有在实际发生错误的地方发布代码:您引用的行(调用
-LIX\u number
)没有出现。错误消息说NSNumber与导致异常的nil值进行比较。什么是LIX_number
?哎呀,行错了,我的错这可能与您的问题无关,但是免费(documentSearch())有什么意义;文档搜索()代码>?如果我没有大错特错的话,那么一旦你去掉了SIGABRT
,你就会在这里创建一个无休止的递归。当你使用setDocNumber
而不是setDocNumber
时,它会发生变化吗?我也认为[nSearch docNumber]
出于某种原因返回nil。但是为什么呢nSearc
是对docs
中所有对象的迭代对象,您可以清楚地看到docs
包含5个SMADoc
类型的元素,您可以看到它们是如何创建的。@HermannKlecker能否将您的属性定义为@property(非原子,强)NSNumber*docNumber;然后再试。@HermannKlecker我试过了,但不幸的是,我在控制台的同一行和同一输出上仍然得到相同的错误。请在for循环之前打印数组对象好吗?让我们知道。(这不是我的代码:-)),因为他没有到达@autoreleasepool块的末尾,强引用或弱引用并不重要。虽然你是对的,但它应该是一个强大的。哦,好吧!非常感谢你的提示!
if ([sNumber isEqualToNumber:[nSearch docNumber]])
if ([sNumber isEqualToNumber:[nSearch docNumber]]) {
[...]
if (![sNumber isEqualToNumber:[nSearch docNumber]]) {
if (number == [[nSearch docNumber] intValue]) {
[...]
(!(number == [[nSearch docNumber] intValue])) {