NSZombie на iOS не в симуляторе - PullRequest
1 голос
/ 18 мая 2011

У меня ошибка при сбое в функции автоматического выпуска.Классический: доступ к объекту после чрезмерного выпуска.

Проблема заключается в том, что программа iOS использует EAAccessory и происходит где-то в результате получения данных с устройства.

В результатеПроблема должна быть диагностирована с симулятора.Из-за требований к памяти NSZombie NSZombie отключен для iOS вне симулятора.

Какие-либо советы / идеи, как отследить ошибку, связанную с избыточным выпуском, было бы легко с NSZombie в мире iOS вне симулятора?

Я уже думал о том, чтобы попытаться заглушить поведение EAAcessory для симулятора;но из-за нехватки времени это скорее «следующий ре-рефактор / улучшение» из-за необходимого объема работы.

Сейчас мне просто нужно найти ошибку плохого доступа.

1 Ответ

1 голос
/ 18 мая 2011

Поскольку у меня нет опыта работы с EAAccessory, я не знаю, является ли это жизнеспособным, но вот предложение. С сохранить / отпустить отладку (rentzsch.tumblr.com):

#if 1
- (id)retain {
    NSUInteger oldRetainCount = [super retainCount];
    id result = [super retain];
    NSUInteger newRetainCount = [super retainCount];
    printf("%s<%p> ++retainCount: %lu => %lu\n", [[self className] UTF8String], self, oldRetainCount, newRetainCount);
    printf("%s\n", [[[NSThread callStackSymbols] description] UTF8String]);
    return result;
}

- (void)release {
    NSUInteger oldRetainCount = [super retainCount];
    BOOL gonnaDealloc = oldRetainCount == 1;
    if (gonnaDealloc) {
        printf("%s<%p> --retainCount: 1 => 0 (gonna dealloc)\n", [[self className] UTF8String], self);
        printf("%s\n", [[[NSThread callStackSymbols] description] UTF8String]);
    }
    [super release];
    if (!gonnaDealloc) {
        NSUInteger newRetainCount = [super retainCount];
        printf("%s<%p> --retainCount: %lu => %lu\n", [[self className] UTF8String], self, oldRetainCount, newRetainCount);
        printf("%s\n", [[[NSThread callStackSymbols] description] UTF8String]);
    }
}
#endif

Вы можете добавить фильтр по классу для запуска кода отладки только для определенных классов, которые вы подозреваете.

...