Как установить неинициализированное значение в Objective C? - PullRequest
0 голосов
/ 30 мая 2009

Этот вопрос может быть неосновным, но вот проблема, с которой я столкнулся:

Я пытаюсь запустить пример из 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, так что я могу быть вне базы.

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


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

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

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

1 Ответ

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

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

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

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

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