Почему я получаю ошибку isEqualToString в этом коде Какао? - PullRequest
0 голосов
/ 15 мая 2009

Я получаю эту ошибку:

альтернативный текст http://img514.imageshack.us/img514/2203/help.tif

Что это? Я никогда даже не называл isEqualToString.

Вот моя шутка. М

@implementation Joke
@synthesize joke;
@synthesize rating;


- (id)init {
[super init];
return self;
 }

- (void)dealloc {
[joke release];
[super dealloc];    
}

+ (id)jokeWithValue:(NSString *)joke {
Joke *j = [[Joke alloc] init];
j.joke = joke;
return [j autorelease];
}

@end

А вот и шутка.

@interface Joke : NSObject {
NSString *joke;
int rating;
}

+ (id)jokeWithValue:(NSString *)joke;

@property (readwrite, copy) NSString *joke;
@property (readwrite) int rating;

@end

А вот где используется шутка

#import "TableViewController.h"
#import "Joke.h"

@implementation TableViewController
@synthesize jokes;

- (id)initWithCoder:(NSCoder *)coder {
if (self = [super initWithCoder:coder]) {
    self.jokes = [NSMutableArray arrayWithObjects:
                  [Joke jokeWithValue:@"If you have five dollars and Chuck Norris has five dollars, Chuck Norris has more money than you"],
                  [Joke jokeWithValue:@"There is no 'ctrl' button on Chuck Norris's computer. Chuck Norris is always in control."],
                  [Joke jokeWithValue:@"Apple pays Chuck Norris 99 cents every time he listens to a song."],
                  [Joke jokeWithValue:@"Chuck Norris can sneeze with his eyes open."],
                  nil];
    }
return self;
 }

- (void)viewDidLoad {
self.navigationItem.leftBarButtonItem = self.editButtonItem;
} 


 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // Saying how many sections wanted (Just like in address, where sorts by first name)
return 1;
 }

 - (NSInteger)tableView:(UITableView *)tableView 
numberOfRowsInSection:(NSInteger)section {
return [jokes count];
 }


 - (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  static NSString *CellIdentifier = @"Team";    
  UITableViewCell *cell = 
[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  if (cell == nil) {
    cell = [[[UITableViewCell alloc] 
             initWithFrame:CGRectZero 
             reuseIdentifier:CellIdentifier] autorelease];
   }
cell.text = [jokes objectAtIndex:indexPath.row];
   return cell;
  }

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath  *)indexPath {
 }


 - (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
 }

 - (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
 }

 - (BOOL)shouldAutorotateToInterfaceOrientation:
 (UIInterfaceOrientation)interfaceOrientation {
  return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
  }

 - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning]; 
 }

 - (void)dealloc {
 [jokes release];
 [super dealloc];
 }

 @end

Спасибо

Ответы [ 5 ]

11 голосов
/ 15 мая 2009

Заменить эту строку:

cell.text = [jokes objectAtIndex:indexPath.row];

с этими строками:

Joke *j = (Joke *)[jokes objectAtIndex:indexPath.row];
if( j )
  cell.text = j.joke;
3 голосов
/ 15 мая 2009

Трассировка стека поможет вам точно определить, что вызывает isEqualToString:. К сожалению, он не дает вам никаких символов, поэтому вам придется немного покопаться.

В методах Objective-C есть два скрытых параметра, которые всегда передаются в качестве первых двух аргументов: self, указатель на объект, на который отправляется сообщение, и _cmd, указатель на Строка C, содержащая имя отправляемого сообщения. Изучение аргументов _cmd в кадрах стека поможет вам отладить проблему.

Первое, что вы хотите сделать, это установить точку останова непосредственно перед выдачей исключения. Откройте консоль отладчика (Cmd + Shift + R) и добавьте точку останова к функции в верхней части трассировки стека, набрав:

break 2438463755

Теперь запустите ваше приложение, и отладчик должен выйти из строя прямо перед тем, как выдать исключение. Это также должно дать вам полный символический след; если нет, вам придется пройтись по стеку самостоятельно. Вы можете пройтись по стопке и распечатать значение различных параметров _cmd.

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

Вы скрываете имя ivar аргументом функции. Попробуйте изменить свой jokeWithValue: метод на это:

В шутку.h:

+ (id)jokeWithValue:(NSString *)aJoke;

в шутку.m:

+ (id)jokeWithValue:(NSString *)aJoke {
     Joke *j = [[Joke alloc] init];
     j.joke = aJoke;
     return [j autorelease];
}

Обратите внимание, что имя переменной NSString изменилось, поэтому оно больше не затеняет шутку iVar.

EDIT:

Видя, как вызывается шутка, похоже, что вы присваиваете объект-шутку cell.text, который, я считаю, ожидает, что строка NSString не является шуткой.

попробуйте установить:

cell.text = [[jokes objectAtIndex:index] joke];

in - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath

1 голос
/ 15 мая 2009

Ошибка не в определении класса Joke, а где-то, где он используется. В большинстве случаев с такими ошибками это происходит из-за ошибки управления памятью - один объект (предположительно строка) освобождается, а другой размещается в его старой ячейке памяти. Попробуйте запустить с NSZombieEnabled и посмотрите, не переходит ли сообщение к освобожденному объекту.

0 голосов
/ 15 мая 2009

ваше сообщение об ошибке не отображается, но я предполагаю, что вы столкнулись с оператором, который за кадром вызывает isEqualToString, и один из объектов не является строкой

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