程序停止处理数组中的太多文件

Program stops working with too many files in array

我编写了这个搜索程序来搜索包含文件名和我计算机上文件路径的对象数组。当我编写程序时,我有两个测试文件,它们与我的代码配合得很好。然后我开始添加实际文件,它可以很好地处理 10-20 个文件,所以我决定再添加几个(大约 45 个文件,总共约 60 个文件)。这是它出错的地方;该程序运行,但我无法搜索任何文件而不会出现 "Thread 1: signal SIGABRT" 错误,在线是我的搜索功能。我还在控制台中收到一条错误消息,但恐怕我无法理解。当我只有 10 个文件时文件是否可搜索并不重要,当我使用所有文件时它停止工作。我在下面包含我的代码:

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

#import <Foundation/Foundation.h>

@interface SMADoc : NSObject

@property (nonatomic) NSNumber *docNumber
@property (nonatomic) NSString *urlToDoc;

@end

main.m(包含 5 个文件)

#import <Foundation/Foundation.h>
#import "SMADoc.h"
#include <readline/readline.h>
@import AppKit;

void *documentSearch() {
SMADoc *one = [[SMADoc alloc] init];
[one setdocNumber:@(17800)];
[one setUrlToDoc:@"/Users/Docs/docPath1.pdf"];

SMADoc *two = [[SMADoc alloc] init];
[two setdocNumber:@(11632)];
[two setUrlToDoc:@"/Users/Docs/docPath2.pdf"];

SMADoc *three = [[SMADoc alloc] init];
[three setdocNumber:@(17583)];
[three setUrlToDoc:@"/Users/Docs/docPath3.pdf"];

SMADoc *four = [[SMADoc alloc] init];
[four setdocNumber:@(14351)];
[four setUrlToDoc:@"/Users/Docs/docPath4.pdf"];

SMADoc *five = [[SMADoc alloc] init];
[five setdocNumber:@(11628)];
[five setUrlToDoc:@"/Users/Docs/docPath5.pdf"];

NSMutableArray *docs = [[NSMutableArray alloc] initWithObjects:one, two, three, four, five, nil];

int i = 0;

NSLog(@"Enter what you want to search for: ");
const char *searchC = readline(NULL);
int number = atoi(searchC);
NSNumber *sNumber = [NSNumber numberWithInteger:number];

for (SMADoc *nSearch in docs) {
    if ([sNumber isEqualToNumber:[nSearch docNumber]]) {
        NSLog(@"Opening document...");
        [[NSWorkspace sharedWorkspace] openFile:[nSearch urlToDoc]];
    }
    if (![sNumber isEqualToNumber:[nSearch docNumber]]) {
        i++;
    }
}
if (i == [docs count]) {
    NSLog(@"A match could not be found, please check your spelling");
}
free(documentSearch());
documentSearch();

return 0;
}

int main(int argc, const char * argv[]) {
@autoreleasepool {
    NSLog(@"message");
    documentSearch();
}
return 0;
}

正是下面这一行导致了 SIGABRT 错误:

 if ([sNumber isEqualToNumber:[nSearch docNumber]]) {

这是控制台中的输出:

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 个文件不断崩溃,一个有五个文件(我在这里发布的代码)并在

处设置断点
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 线程的 link:http://forums.macrumors.com/threads/comparing-two-numbers-causes-error.1900677/