Приложение аварийно завершает работу с EXC_CRASH (SIGABRT) в TableView Titanium - PullRequest
1 голос
/ 31 августа 2010

Я на Titanium 1.2.1, использую SDK 4.0, компилирую на устройство с 3.1.3. Этот сбой не проявляется в симуляторе, а только на устройстве. У меня есть tableView, перечисляющий список контактов. При щелчке по имени контакта открывается новое тяжелое окно (в другом контексте выполнения). В новом окне отображаются сведения о контакте, такие как его имя и изображение, а затем он отправляет серверу запрос ajax для заполнения всех остальных сведений.

contactTableView.addEventListener('click', function(evt) {
    var contactWin = Ti.UI.createWindow({
        url: "contacts_show.js",
        title: evt.rowData.title,
        backgroundColor: colors.window_bg_color,
        barColor: colors.topbar_bg_color
    });
    contactWin.contact = evt.rowData.contact;

    Ti.UI.currentTab.open(contactWin, { animated: true });
});

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

Вот журнал сбоев: http://gist.github.com/557988

Из журнала сбоев кажется, что когда я ходил взад и вперед, он дошел до того, что решил, что нужно убить контекст выполнения, чтобы сэкономить память. Но в этот момент похоже, что он падает, когда пытается удалить прослушиватель событий. Я не думаю, что я делаю что-то странное со слушателями событий. Кто-нибудь знает, как я могу отладить эту проблему? Заранее спасибо.

1 Ответ

0 голосов
/ 02 сентября 2010

Я понял это.Краткая версия ответа состояла в том, что я поместил addEventListeners в файлы, которые были включены несколько раз.Следовательно, массив, который содержал списки событий, при уничтожении при уничтожении контекста выполнения, мутировал во время итерации.Следовательно, SIGABORT.

Я переместил любые вызовы addEventListener в файл окна верхнего уровня любого контекста выполнения и никогда не помещал его ни в какие включенные файлы.

...