Помогите с журналом сбоя - PullRequest
2 голосов
/ 25 августа 2011

Мое приложение падает на Lion, когда просыпается ото сна.Кажется, проблема в фоновом потоке, который ищет информацию о погоде.Я не уверен, но я думаю, что журнал аварийных сбоев говорит мне, что пул автоматического выпуска выдает объекты, которых больше нет, может кто-нибудь помочь мне подтвердить это?

Вот соответствующие подробности для журнала аварий:

Процесс: myApp [14187] Идентификатор: myApp Версия:
???(???) Тип кода: X86-64 (собственный) Родительский процесс: launchd [224]

Дата / Время: 2011-08-24 18: 58: 00.581 -0400 Версия ОС: Mac OS X 10.7.1 (11B26) Версия отчета: 9

Сбой потока: 7

Тип исключения: EXC_BAD_ACCESS (SIGSEGV) Коды исключений: KERN_INVALID_ADDRESS по адресу 0x0000000000000010

Специфичная для приложения информация: obj14187]: сборка мусора выключена

Сбой 7 потока: 0 libobjc.A.dylib
0x00007fff9321700b (пространство анонимных имен) :: AutoreleasePoolPage :: pop (void *) + 385 1
com.apple.CoreFoundation 0x00007fff961306a5 CFAutoreleasePoolPop + 37 2 com.apple. Фундация
0x00007fff969350d7 - [NSAutoreleasePool сток] + 154 3
com.piso13.opusDomeini.1022 * 0x00007fff9698b1ea - [NSThread main] + 68 5 com.apple.Foundation
0x00007fff9698b162 NSThread
_main + 1575 6 libsystem_c.dylib
0x00007fff_0bb_bb68687 libsystem_c.dylib
0x00007fff90b09b75 thread_start + 13

Вот мой код для внутреннего запуска Weather:

-(void)internalStart{
    pool = [[NSAutoreleasePool alloc] init];

    forecast = FALSE;
    liveweather = FALSE;

    NSString *query = [self generateQuery];
    if (query == nil) {
        [pool drain];
        return;
    }


    XmlWrapper * xmlWrapper = [[XmlWrapper alloc] initWithQuery:query delegate:self name:@"liveweather"];
    [xmlWrapper release];

    query = [self generateForecastQuery];
    xmlWrapper = [[XmlWrapper alloc] initWithQuery:query delegate:self name:@"forecast"];
    [xmlWrapper release];

    [pool drain];

}

Должен ли я вообще звонить [из бассейна]?

Ответы [ 2 ]

4 голосов
/ 25 августа 2011

Создайте свои пулы автоматического выпуска с ограниченными временами жизни и явными областями действия.

в этом случае ваш пул авто-релиза хранится в иваре (предположительно).

просто сделайте его локальным для метода, вот так:

- (void)internalStart
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    //...
    [pool drain], pool = nil;
}

типичные проблемы:

1) пулы автоматического выпуска основаны на стеке (пулы выдвигаются и выталкиваются). удерживая его, вы можете легко испортить порядок в стеке.

2) если этот класс работает в многопоточном контексте, вы можете легко пропускать пулы или разрушать порядок стеков, когда вы извлекаете и извлекаете пулы из нескольких потоков.

3) вы также можете пропускать пулы в многопоточных контекстах

3 голосов
/ 25 августа 2011

К сожалению, сбои автозапуска являются одними из самых сложных для отладки. Начните со статического анализатора, который может найти некоторые вещи.

Затем включите NSZombies .

Ваш XmlWrapper объект немного странный. Почему вы сразу же выпускаете его, как только создаете? Это обертка вокруг NSURLConnection? Вы все еще должны удерживать объект, чтобы можно было отменить его или очистить его делегат после освобождения этого объекта.

Убедитесь, что вы используете аксессоры для всех своих иваров, а не обращаетесь к ним напрямую. Прямой доступ к иварам за пределами init и dealloc является # 1 причиной таких сбоев в моем опыте.

...