2012-02-18 2 views
4

ВведенияIOS - Получение странных ошибок: непризнанный селектор направил к экземпляру на UITableView

В моем текущем приложении у меня есть UITableView, который хранит объекты пользовательских ячеек. Пользовательские UIViewCellObjects просто подклассифицированы из стандартного класса UITableViewCell. Пользовательские ячейки хранят информацию о запуске загрузки фона и обновляют их такими вещами, как процент выполнения и т. Д.

Пользовательские объекты ячейки прослушивают NSNotifications из процессов загрузки, выполняющихся в фоновом режиме, и когда они получают соответствующее уведомление, они просто обновляют свои собственные элементы управления представлением с помощью новой информации (например, процента загрузки).

Теперь, когда процесс загрузки будет сделано, я повторно заказать массив активных объектов загрузки и перезагрузки TableView так:

-(void) uploadFinished: (NSNotification*)notification 
{ 
    NSDictionary *userInfo = [notification userInfo]; 

NSNumber *uploadID = [userInfo valueForKey:@"uploadID"]; 

if (uploadID.integerValue == uploadActivity.uploadID) 
{ 
    [[ApplicationActivities getSharedActivities] markUploadAsFinished:uploadActivity]; 
    [parentTable reloadData]; 

    [self setUploadComplete]; 
} 
} 

Сейчас этот метод имеет место в объектах tableviewcell, и, как вы можете см., что они называют свой собственный UITableView для перезагрузки данных сразу после сортировки массива. Метод markUploadAsFinished просто переупорядочивает массив так, чтобы все новые готовые загрузки помещались вверху, поэтому он будет отображаться таким образом в UITableView.

Проблема

Теперь проблема у меня в том, что, когда вызывается этот метод, я иногда получить следующее сообщение об ошибке: 'NSInvalidArgumentException', причина: «- [CALayer Tableview: numberOfRowsInSection:]: непризнанный селектор, отправленный в экземпляр

Я не получаю его все время, иногда весь процесс выполняется нормально, а готовые загрузки появляются в начале UItableview, а в других, казалось бы, случайных моментах он терпит неудачу. Я действительно не понимаю, что здесь происходит.

Пользовательские элементы загружаются из .NIB файла, как это:

UploadCell *cell = [activeUploadsTable dequeueReusableCellWithIdentifier:@"UploadProgressCell"]; 

if (cell == nil) 
{ 
    [[NSBundle mainBundle] loadNibNamed:@"UploadCellView" owner:self options:nil]; 

    cell = customCell; 
} 

есть кто-нибудь, кто мог бы иметь понятия о том, что здесь происходит?

EDIT

Прежде всего, я разыскал эту ошибку появляться прямо на линии, где: reloadData

называется внутри объектов пользовательских ячеек.

Кроме того, кажется, что экземпляр, который он отправляет, может измениться. Я тоже получил эту ошибку:

'NSInvalidArgumentException', reason: '-[UIScrollViewPanGestureRecognizer tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 

Я действительно не знаю, что здесь происходит.

+2

Где вы устанавливаете 'dataSource' вашего вида таблицы? Кажется, что он установлен на экземпляр 'CALayer', когда он терпит неудачу. –

+0

Источник данных tableview установлен в файле .nib с именем «ActiveUploads». Этот .nib-файл просто содержит UIView, содержащий сам UItableview. Затем UITableView datasource + delegate устанавливается владельцем файлов .nib-файла, а владелец файла - UIViewController, который обрабатывает созданное вами выше. – CodingBeagle

+0

Вы запустили с включенными зомби? –

ответ

6

'-[CALayer tableView:numberOfRowsInSection:]: unrecognized selector sent to instance

У вас плохой указатель. Похоже, что источник данных вашего стола освобождается, пока таблица все еще существует. Таблица не сохраняет свой источник данных, поскольку это может создать цикл сохранения. Если вы не заботитесь о том, чтобы поддерживать источник данных во время использования таблицы, таблица может работать с указателем на объект, который больше не существует. В этом случае, похоже, что объект CALayer впоследствии создается по тому же адресу. Когда таблица позже отправляет свой «источник данных» сообщение для получения количества строк, это сообщение доставляется на уровень, который (очевидно) не имеет метода -tableView:numberOfRowsInSection:, и ошибка возникает.

+0

Aha! Вот почему! как вы сказали, я выяснил, что причина была плохой указатель, хотя я все еще не уверен в основной причине, но это проясняет :) Спасибо! – CodingBeagle

0

Согласно мне, вы используете метод процесса загрузки в фоновом режиме, я думаю, что это другой поток, чем основной поток. И, согласно моим знаниям, когда вы имеете дело с объектами UIKIT, у вас есть руины в основной теме.

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

+0

Спасибо, но я уже исправил эту проблему :) Я сделаю сообщение об этом, как только Stackoverflow позволит мне ответить на мой собственный вопрос :) Это произошло не из-за проблем с потоковой безопасностью, поскольку базовые объекты загрузки используют стандартный асинхронный метод NSURLConnection, который связан с синхронизацией с основным потоком. – CodingBeagle

 Смежные вопросы

  • Нет связанных вопросов^_^