2015-07-09 2 views
0

Я написал эту программу поиска для поиска по массиву объектов, который содержит имя файла и путь к файлу на моем компьютере. Когда я написал программу, у меня было два тестовых файла, которые отлично работали с моим кодом. Затем я начал добавлять фактические файлы, и он отлично работал с 10-20 файлами, поэтому я решил добавить еще несколько (около 45, что составило в общей сложности около 60 файлов). Это было ошибкой; Программа запускается, но я не могу найти какой-либо файл, не получив сообщение «Thread 1: signal SIGABRT», на линии была моя функция поиска. Я также получаю сообщение об ошибке в консоли, но я боюсь, что не могу этого понять. Неважно, если файл доступен для поиска, когда у меня всего 10 файлов, он перестает работать, когда я использую их все. Я включил мой код ниже:Программа перестает работать со слишком большим количеством файлов в массиве

SMADoc.h (пользовательский класс для создания объектов, которые 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) 

Если бы кто-нибудь мог помочь мне разобраться в этом, я был бы очень признателен!

+0

Это не выглядит, как вы разместили код, где ошибка на самом деле происходит: строку, которую цитировал (с вызов '-LIX_number') не отображается. –

+0

В сообщении об ошибке указано, что NSNumber сравнивается с значением nil, которое вызывает исключение. Что такое 'LIX_number'? – vadian

+0

Упс, неправильная строка, мой плохой – pinkRobot435

ответ

0

Я решил это! Люди в MacRumors помогли мне решить мою проблему! Я открыл обе версии своей программы; Один с 60-файлов, которые хранятся сбой и одна с пятью файлами (код, который я разместил здесь) и установить точку останова

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

в обеих версиях, а затем исследовали переменные, и я нашел то, что было неправильно. Я выяснил, что значение переменной sNumber, которое пользователь вводит, иногда получает в double вместо int, и это была проблема! Я решил эту проблему, используя переменное число вместо sNumber (так как это уже было целое) и заменить этот код:

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

    [...] 

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

с этим:

if (number == [[nSearch docNumber] intValue]) { 

    [...] 


(!(number == [[nSearch docNumber] intValue])) { 

И решить эту проблему!

EDIT: Вот ссылка на MacRumors-нить, если кому-то интересно: http://forums.macrumors.com/threads/comparing-two-numbers-causes-error.1900677/

0

есть ли ваш номер содержит номер? Я чувствую себя

[nSearch docNumber] 

должен быть нулем, т.е. это сбой

+0

Я тоже думаю, что '[nSearch docNumber]' по какой-то причине возвращает nil. Но почему? 'nSearc' является итерирующим объектом по всем объектам в' docs', и вы можете ясно видеть, что 'docs' содержит 5 элементов типа' SMADoc', и вы можете видеть, как они создаются. –

+0

@HermannKlecker пожалуйста, вы можете определить вашу собственность как ** @ собственности (неатомической, сильный) NSNumber * docNumber; ** и попробовать. – NSSwift

+0

@HermannKlecker Я попробовал, но, к сожалению, я все равно получаю ту же ошибку в той же строке и тот же вывод в консоли. – pinkRobot435

0

не ответ на ваш вопрос, но обращаясь к нашему разговору в комментариях по поводу бесконечного цикла. Ваш рекурсивный и никогда не закончится. Со временем вы столкнетесь с потоком stackoverflow. Это правильный способ достижения той же:

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

Обратите внимание, что @autoreleasepool находится в пределах цикла.

+0

О, ладно! Большое спасибо за подсказку! – pinkRobot435

Смежные вопросы