Почему мое приложение закрывается с "SIGABRT"? - PullRequest
1 голос
/ 29 января 2011

Я работаю над приложением для iPhone, которое получит список покупок в виде xml от службы HTTP REST.Но когда я запускаю приложение, оно выходит с SIGABRT в симуляторе.

По трассировке стека видно, что я нахожусь внутри [выпуск NSAutoreleasePool], поэтому я полагаю, что это проблема управления памятью.Проблема с пулом автоматического выпуска состоит в том, что может быть очень трудно отследить, что является действительной проблемой.

Однако я обнаружил, что это как-то вызвано вызовом [NSURLConnection sendSynchronousRequest], потому чтоЯ помещаю свое заявление возврата непосредственно перед тем вызовом, тогда я не получаю ошибку (кроме данных нет).Если я помещу свой оператор return сразу после sendSynchronousRequest, то получу SIGABRT.

Вот функция

- (NSArray*)getShoppingListItems {
    NSString *escapedToken = [self.user.token URLEncodedString_ch];
    NSString *strUrl = [[NSString alloc] 
                        initWithFormat:@"http://www.denglademad.dk/shoppinglist/foruser/%@?token=%@",
                        self.user.userID, escapedToken];
    NSURL *url = [[NSURL alloc] initWithString:strUrl] ;
    NSURLRequest *urlRequest = [[NSURLRequest alloc] initWithURL:url];
    NSURLResponse *resp = nil;
    NSError *err = nil;
    // Returning [NSMutableArray array] does not cause SIGABRT
    NSData *response = [[NSURLConnection 
                        sendSynchronousRequest:urlRequest 
                        returningResponse: &resp
                        error: &err] retain];
    // Returning here does cause a SIGABRT
    return [NSMutableArray array]; 
    NSString *xml = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
    ShoppingListXmlParser *parser = [[ShoppingListXmlParser alloc] init];
    return [parser parseShoppingListXmlData:response];
}

Я знаю, что есть много вещей, которые должны быть освобождены, ноэто проблема с автоматическим выпуском, я только что в отчаянии временно удалил все вызовы выпуска / автоматического выпуска.

Вот вывод отладчика.

...
Canceling call as the malloc lock is held so it isn't safe to call the runtime.
Issue the command:
    set objc-non-blocking-mode off 
to override this check if you are sure your call doesn't use the malloc libraries or the ObjC runtime.
(gdb) continue
DenGladeMad(619,0xa0c51540) malloc: *** error for object 0x4d3cd40: double free
*** set a breakpoint in malloc_error_break to debug
Program received signal:  “SIGABRT”.
(gdb) 

Есть какие-нибудь подсказки?

1 Ответ

2 голосов
/ 29 января 2011

Обычно это ошибка, связанная с освобождением нераспределенного объекта.Попробуйте установить NSZombieEnabled = YES на исполняемый файл вашей цели.Просто дважды щелкните исполняемый файл в XCode, выберите вкладку аргументов и установите ее в разделе переменных среды в нижней половине окна свойств.В следующий раз, когда вы нажмете на него в симуляторе, вы получите гораздо больше подробностей об og.

Обязательно отключите эту переменную перед сборкой и отправкой приложения.Когда оно включено, используется много ресурсов, поэтому ваше приложение будет страдать от снижения производительности.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...