iPhone - массив потерян между appDidBecomeActive: и запуск цикла запуска? - PullRequest
1 голос
/ 15 января 2010

EDIT: я застрял в одном вызове, чтобы вручную сохранить массив сразу после его инициализации, и это исправило его. Dur. Спасибо.

Я сохраняю NSMutableArray в подклассе UIScrollView и добавляю в него экземпляры подкласса UIImageView, поскольку каждый из них добавляется как подпредставление. Это должен быть изменяемый массив, так как я планирую со временем изменить их порядок в массиве; эта ошибка возникает еще до того, как я пытаюсь это сделать. Я использовал NSLogs, чтобы показать, что массив имеет счет до 10, включая applicationDidBecomeActive: вызывается в моем AppDelegate, и добавил таймер для запуска каждые 0,001 с в цикле выполнения. При первом запуске он не может найти массив больше! Я очень смущен и пытаюсь выследить это часами.

Таймер работает правильно (то есть, когда printCount: не обращается к массиву, это нормально), только когда я пытаюсь получить доступ к массиву там, он ломается. Обычный вызов printCount: ниже работает, но в первый раз срабатывает таймер. Что может произойти между этими двумя вызовами printCount:?

- (void)applicationDidBecomeActive:(UIApplication *)application {
    NSTimer *timer = [[NSTimer scheduledTimerWithTimeInterval:0.001f
                                                       target:[viewController view]
                                                     selector:@selector(printCount)
                                                     userInfo:nil
                                                      repeats:YES]
                      retain];
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
    [[viewController view] printCount];
}

Я бесконечно шагал по программе с помощью отладчика. Массив корректен вплоть до этой точки, и его адрес памяти остается неизменным даже после изменения его содержимого. Однако впоследствии в нем остается только один объект - его 10 элементов заменяются одним экземпляром UITouchData. Понятия не имею, откуда это. Ни один из моих методов обработки событий не пытается переназначить массив или изменить его. Есть идеи, что может пойти не так? Я полностью озадачен.

Ответы [ 5 ]

2 голосов
/ 15 января 2010

Вы -retain массив?

0 голосов
/ 15 января 2010

Представление инициализирует и освобождает массив?
Вы уверены, что NSView не освобождается в промежутке между ними?
Можно проверить, является ли адрес памяти [viewController view] (== self в printCount) одинаков каждый раз, когда ваш таймер звонит printCount.

0 голосов
/ 15 января 2010

Я застрял в вызове, чтобы сохранить массив сразу после его инициализации, и это исправило это. Dur.

Спасибо за предложения. Как обычно случается с такими проблемами, это было очень просто, и, наконец, сдача и обращение за помощью вызывает решение и заставляет меня чувствовать себя глупо. : D

0 голосов
/ 15 января 2010

его 10 элементов заменяются один экземпляр UITouchData. Без понятия откуда это.

Всегда ли это экземпляр UITouchData? Всегда? - Причина, по которой может показаться, что это бесполезная раздача (если она не ОДНОВРЕМЕННАЯ) проблемы памяти.

0 голосов
/ 15 января 2010

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

...