Objective c 程序停止处理数组中过多的文件

Objective c 程序停止处理数组中过多的文件,objective-c,if-statement,sigabrt,Objective C,If Statement,Sigabrt,我编写了这个搜索程序,用于搜索包含文件名和指向计算机上文件路径的对象数组。当我编写程序时,我有两个测试文件,它们与我的代码配合得非常好。然后我开始添加实际的文件,它可以处理10-20个文件,所以我决定再添加一些(大约45个,总共大约60个文件)。这是如果它出了问题;该程序运行,但我不能搜索任何文件,没有得到“线程1:信号SIGABRT”错误,就行了我的搜索功能是。我在控制台中也收到一条错误消息,但我恐怕无法理解。当我只有10个文件时,文件是否可搜索并不重要,当我使用所有文件时,它将停止工作。我将

我编写了这个搜索程序,用于搜索包含文件名和指向计算机上文件路径的对象数组。当我编写程序时,我有两个测试文件,它们与我的代码配合得非常好。然后我开始添加实际的文件,它可以处理10-20个文件,所以我决定再添加一些(大约45个,总共大约60个文件)。这是如果它出了问题;该程序运行,但我不能搜索任何文件,没有得到“线程1:信号SIGABRT”错误,就行了我的搜索功能是。我在控制台中也收到一条错误消息,但我恐怕无法理解。当我只有10个文件时,文件是否可搜索并不重要,当我使用所有文件时,它将停止工作。我将我的代码包括在下面:

SMADoc.h(用于创建PDF对象的自定义类)

这是控制台中的输出:

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])) {