"isEqualToString" ошибка какао - PullRequest
3 голосов
/ 31 мая 2009

Я получаю сообщение об ошибке в моей консоли:

2009-05-30 20: 17: 05.801 ChuckFacts [1029: 20b] *** - [Шутка isEqualToString:]: не распознано селектор отправлен на экземпляр 0x52e2f0

Вот мой код, из которого, по-моему, исходит ошибка:

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Joke";  
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) { 
    [[NSBundle mainBundle] loadNibNamed:@"TableCell" owner:self options:nil]; 
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero 
                                   reuseIdentifier:CellIdentifier] autorelease];
    cell = tableCell;
}

NSString *jokeText = [jokes objectAtIndex:indexPath.row];
UILabel *jokeTextLabel = (UILabel*) [cell viewWithTag:1];
jokeTextLabel.text = jokeText; 
NSString *dateText = formattedDateString;
UILabel *dateTextLabel = (UILabel*) [cell viewWithTag:2];
dateTextLabel.text = dateText;
[self todaysDate];
return cell;
}

"шутки" - это массив шуток, если вам нужно было знать

Почему появляется эта ошибка?

Кроме того, вы видите часть ошибки, которая гласит:

отправлено экземпляру 0x52e2f0

Как я могу определить, что такое "0x52e2f0", чтобы было легче найти проблему в следующий раз?

Ответы [ 2 ]

19 голосов
/ 31 мая 2009

Почему появляется эта ошибка?

Поскольку вы отправляете isEqualToString: объекту Шутки, а ваши объекты Шутки не отвечают на isEqualToString:.

Вы, вероятно, не намеренно отправляете это сообщение своим объектам Шутки; вместо этого вы передаете или возвращаете объекты Joke чему-то, что ожидает объекты NSString.

Вы говорите, что jokes - это «множество полных шуток». Тем не менее, в вашем коде вы делаете это:

NSString *jokeText = [jokes objectAtIndex:indexPath.row];
UILabel *jokeTextLabel = (UILabel*) [cell viewWithTag:1];
jokeTextLabel.text = jokeText;

Исходя из исключения, я предполагаю, что под «массивом шуток» вы подразумевали «массив объектов шутки».

Помещение объекта Joke в переменную NSString * не превращает объект Joke в строку NSString. Все, что вы делаете, это сообщаете компилятору, что переменная содержит строку NSString, а затем вставляете в нее шутку. Я называю это «ложью компилятору».

Первый шаг в исправлении этого - удалить ложь и восстановить правду на своем месте:

Joke *joke = [jokes objectAtIndex:indexPath.row];

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

jokeTextLabel.text = jokeText; 

предупреждение: передача аргумента 1 из 'setText:' из отдельного типа Objective-C

Это верно, конечно. Шутки все еще не NSStrings. Теперь, когда вы честны с типом переменной, компилятор может поймать это за вас.

Фактическое исправление возникает, когда вы запрашиваете у объекта Joke его текст (я предполагаю, что у него есть свойство для этого, и что значение этого свойства является строкой NSString) и передаете , что jokeTextLabel.text сеттер.

Как я могу определить, что такое "0x52e2f0", чтобы было проще найти проблему в следующий раз?

В окне точек останова Xcode установите точку останова на objc_exception_throw. Затем запустите вашу программу. Когда происходит исключение, отладчик остановит вашу программу, и откроется окно отладчика. Затем введите po 0x52e2f0 в консоли отладчика. (po означает «объект печати».)

Это работает для приложений Mac; Я предполагаю, что это также будет работать для приложений iPhone.

2 голосов
/ 31 мая 2009

Под «массивом, полным шуток», вы, очевидно, подразумеваете «массив, полный классов типа« Шутка »». Вы не можете назначить объект Joke для свойства text UILabel - оно занимает только NSString.

(Какао не похож на Java или C ++, где любой объект может быть автоматически приведен к строке с помощью некоторого метода .toString(). Обычно платформа запрашивает NSString s явно, когда она хочет строку.)

Вот что происходит: вы присваиваете объект Joke свойству text. Какао позволяет вам быстро и свободно играть с подобными типами, даже без предупреждения в этом случае, так как это неявно понимается как строка NSSt (тип id автоматически станет тем типом, которому вы его назначаете). Но когда он пытается вызвать isEqualToString: (метод NSString) для объекта Joke, он, конечно, завершается неудачей.

Вместо этого вам нужно назначить текст шутки для метки.

Что касается идентификации объекта: вы можете выполнить команду po 0x52e2f0 в отладчике, которая обычно работает, если память не полностью загружена. Он напечатает представление объекта в Objective-C по этому адресу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...