2009-05-30 3 views
0

Этот вопрос может быть вне базы, но вот в чем проблема:Как установить неинициализированное значение в Objective C?

Я пытаюсь запустить пример из iPhone SDK, и я столкнулся с нарушением прав доступа. Я проследил какое-то поведение, которое, как я думаю, подозрительно.

Вот что класс выглядит следующим образом:

@interface TableViewCell : UITableViewCell { 

@private  
    UILabel *_earthquakeLocationLabel; 
    UILabel *_earthquakeDateLabel; 
    UILabel *_earthquakeMagnitudeLabel; 
    UIImageView *_magnitudeImageView; 
} 

Когда я поставил точку останова в

- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier 

И посмотреть на «я» в отладчике, это показывает, что _earthquakeDateLabel является «0x12», _earthquakeMagnitudeLabel - 0x1000, а остальные два равны нулю. Если я попытаюсь назначить один из ненулевых, я получаю нарушение доступа.

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

Итак, мой вопрос: есть ли что-то особенное в инициализации этих ценностей, которые я должен делать? Или любой способ присвоить значение, когда в нем есть фиктивное значение?


Некоторая дополнительная информация:

Так что, если я назначу ноль для _earthquakeDateLabel и _earthquakeMagnitudeLabel в Initialize, что устраняет проблему. Но я не понимаю, почему объект создается со значениями в этих полях; Я ожидаю, что они будут ноль. Объект создается на куче:

TableViewCell *cell = [[[TableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease]; 

ответ

1

Это звучит как self указатель является поддельным. Значения 0x12 и 0x1000 являются целыми константами; они определенно НЕ указатели на действительные адреса памяти. Тот факт, что вы видите эти значения, указывает на то, что что-то не так, и попытка каким-либо образом манипулировать ими (чтение или запись) приведет к плохому. В этом случае вы получаете нарушение доступа, потому что пытаетесь записать адреса памяти 0x12 и 0x1000, которые являются недопустимыми адресами.

Как вы создаете объекты TableViewCell? Вы делаете TableViewCell *myCell = [[TableViewCell alloc] initWithFrame:...]? Это правильный путь.

Теперь я буду ссылаться на мой психический отладчик: мой догадка, что вы забываете, чтобы объявить TableViewCell объект с указателем, то есть вы объявляя его как TableViewCell myCell вместо TableViewCell *myCell (обратите внимание на наличие звездочка). Это создаст объект в стеке вместо кучи, и в результате он будет содержать мусор в своих элементах данных вместо нулей. Объекты Objective-C, если они правильно выделены, будут иметь все свои члены данных, инициализированные до 0 (или NULL, nil или false, в зависимости от типа данных) после успешного звонка в alloc.

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