Переброшенные свойства в Application Delegate - PullRequest
0 голосов
/ 29 октября 2010

У меня глубокие проблемы. Что-то в моем приложении приводит к тому, что многие свойства в моем делегате приложения теряются (изменение содержимого и даже типа объекта, скажем, NSArray становится NSString ...), и я не могу отладить его. Я не могу найти утечки памяти или ошибок с моей стороны. Единственное, что я обнаружил, это то, что весь путь до ViewDidAppear для просмотра первой вкладки, все в порядке. В представлении отображается таблица. При щелчке по одной из ячеек свойства делегата приложения уже уничтожены.

Что после загрузки представления и до того, как didSelectCellForRow может вызвать это? Никакой другой мой код не выполняется между этими двумя, конечно же, нет кода в делегате приложения.

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

Ответы [ 2 ]

0 голосов
/ 01 декабря 2010

Единственным выходом было просмотреть все ресурсы в делегате приложения и нескольких контроллерах представления, а также убедиться, что я знаю, что произойдет с использованием протокола NSCopying.Произошло 2 ошибки из-за синтезированных, но нулевых (и затем переназначенных!) Объектов, и 1 ошибка копирования, одна или несколько из них привели к сбою при раннем «авторелизе» Objective-C.

0 голосов
/ 29 октября 2010

Звучит так, что либо что-то выходит преждевременно, либо что-то неправильно связано с одной из ваших XIB. Если вы еще этого не сделали, вы можете ознакомиться с NSZombieEnabled, NSDeallocateZombies, NSEnableAutoreleasePool и NSAutoreleaseFreedObjectCheckEnabled. Это переменные среды, которые можно установить на панели «Аргументы» окна «Получить информацию».

Ради здравомыслия я добавил это в -applicationDidFinishLaunching моего AppDelegate:

    #ifdef DEBUG
    //  account for environment value's actual value if set.
    NSString *NSZombieEnabled = (getenv("NSZombieEnabled")) 
                                    ? [NSString stringWithCString:getenv("NSZombieEnabled") encoding:NSASCIIStringEncoding] 
                                    : @"NO";
    DLog(@"NSZombieEnabled = %@", NSZombieEnabled );
    NSString *NSDeallocateZombies = (getenv("NSDeallocateZombies")) 
                                    ? [NSString stringWithCString:getenv("NSDeallocateZombies") encoding:NSASCIIStringEncoding] 
                                    : @"NO";
    DLog(@"NSDeallocateZombies = %@", NSDeallocateZombies );
    NSString *NSEnableAutoreleasePool = (getenv("NSEnableAutoreleasePool")) 
                                    ? [NSString stringWithCString:getenv("NSEnableAutoreleasePool") encoding:NSASCIIStringEncoding] 
                                    : @"YES";
    DLog(@"NSEnableAutoreleasePool = %@", NSEnableAutoreleasePool );
    NSString *NSAutoreleaseFreedObjectCheckEnabled = (getenv("NSAutoreleaseFreedObjectCheckEnabled")) 
                                    ? [NSString stringWithCString:getenv("NSAutoreleaseFreedObjectCheckEnabled") encoding:NSASCIIStringEncoding] 
                                    : @"NO";
    DLog(@"NSAutoreleaseFreedObjectCheckEnabled = %@", NSAutoreleaseFreedObjectCheckEnabled );
#endif

Иногда это избавляет меня от необходимости проверять эти переменные через интерфейс Xcode.

...