Странный переход в cellForRowAtIndexPath к другому оператору возврата

У меня есть это в моем tableView:cellForRowAtIndexPath:

if (condition) {
    // make a custom cell
    return cell;  // line number 240
}
else {
    // make another kind of cell
    return cell;  // line number 256
}

Я получил EXC_BAD_ACCESS, поэтому я запустил отладчик и установил точку останова, проходя код построчно.

Когда я сделал шаг вперед, «перешагнув» со строки номер 256, он перешел прямо к строке 240, то есть в другую ветвь оператора if. Как это возможно???

Большое спасибо за помощь,
Саша


person Mundi    schedule 05.08.2011    source источник
comment
Какую версию XCode и какой компилятор вы используете?   -  person Codo    schedule 05.08.2011
comment
XCode 4.0.2, компилятор LLVM GCC 4.2.   -  person Mundi    schedule 05.08.2011
comment
Попробуйте, произойдет ли то же самое с GCC 4.2. У меня был неудачный опыт работы с LLVM, по крайней мере, в режиме выпуска.   -  person Codo    schedule 05.08.2011
comment
Тот же эффект. Смотрите мой собственный ответ ниже.   -  person Mundi    schedule 05.08.2011


Ответы (4)


Я думаю, что нашел решение. Контроллер представления с табличным представлением также является делегатом фонового потока веб-загрузки. По-видимому, отладчик может проходить только по одному потоку за раз. Подпрограмма делегата действительно вызывала scrollToRowAtIndexPath: без проверки вышеуказанного condition.

Тем не менее, я нахожу поведение отладчика немного загадочным.

person Mundi    schedule 05.08.2011

(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath будет вызываться x раз, где x = количество строк.

Итак, я думаю, ваша проблема в том, что ваш (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section не возвращает правильное значение и, скорее всего, значение, которое больше, чем то, откуда вы извлекаете данные.

т. е. если у вас есть массив размером 3, но вы пытаетесь сделать ячейку 4-й строки.

person Derek Li    schedule 05.08.2011
comment
Спасибо за ответ. numberOfRowsInSection: правильно. Кроме того, отладчик переходит к другой строке на следующем шаге вперед, а не при следующем вызове функции. - person Mundi; 05.08.2011

Этот метод вызывает себя столько раз, сколько строк возвращается в методе numberOfRowsInSection, и каждый раз, когда ячейка равна нулю. Скорее всего, элемент управления перешел к следующей строке, чтобы выделить для нее UITableViewCell, и в это время, я предполагаю, что условие if было выполнено.

person Legolas    schedule 05.08.2011
comment
Спасибо за Ваш ответ. Проверил, условие осталось невыполненным. Кроме того, функция больше не вызывается. Строка номер 240 не имеет точки останова. Указатель отладчика переходит на 240 на следующем шаге. Вот что меня действительно озадачивает. - person Mundi; 05.08.2011
comment
Единственный способ, которым управление может подняться, - это если вы использовали Loops (для, пока и т. д.) или Recursion (cellForRowAtIndexPath). Вы должны проверить поток управления и опубликовать NSLogs :) Это может помочь нам понять и помочь вам с логическими проблемами. - person Legolas; 05.08.2011
comment
Спасибо, я знаю. Но что делает функция step over отладчика? Он должен перейти к следующей строке для выполнения. Даже в случае циклов немыслимо, чтобы он оставался в той же функции и переходил в другую ветвь оператора if. - person Mundi; 05.08.2011

Шаг с обходом аналогичен шагу с входом, за исключением того, что когда он достигает вызова другой процедуры, он не переходит в процедуру. Процедура будет запущена, и вы перейдете к следующему оператору в текущей процедуре.

поэтому перешагните через получение следующего оператора, и ваш вызов cellForRowAtIndexPath будет numberOfRow раз. поэтому в какой-то итерации ваше условие if становится истинным и переходит к вашей строке № 240

person Praveen-K    schedule 05.08.2011
comment
Это не имеет смысла. Если функция действительно вызывается снова, шаг должен перейти к началу функции (т. е. оператору if), а не к строке 240. - person Mundi; 05.08.2011