2009-05-31 3 views
3

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

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» так было бы легче найти проблема в следующий раз?

+0

Точный дубликат: http://stackoverflow.com/questions/865527/cocoa-i-have-an-error-and-after-reading-and-trying-to-figure-it-out-i-cant –

ответ

18

Почему эта ошибка возникает?

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

Возможно, вы не намеренно отправляете это сообщение своим объектам Joke; вместо этого вы передаете или возвращаете объекты 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. Теперь, когда вы честны в отношении типа переменной, компилятор может поймать это для вас.

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

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

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

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

+0

Еще один отличный ответ от вас, Питер. – Abizern

2

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

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

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

Вместо этого вам нужно присвоить текст шутки.

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

+1

На самом деле, в этом случае нет (соответствующего) типа: объект сообщения NSArrayAtIndex: возвращает «id», который может быть принудительно применим к любому типу указателя без предупреждения. –

+0

Действительно, вы правы. Исправленный. –

+0

Фактически вы можете получить строковое представление любого объекта, используя метод -description. Реализация по умолчанию будет просто возвращать что-то вроде , если вы не перевернули его, хотя. –