Как мне установить неинициализированное значение в Objective C?

StackOverflow https://stackoverflow.com/questions/929837

  •  06-09-2019
  •  | 
  •  

Вопрос

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

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

Вот как выглядит этот класс:

@interface TableViewCell : UITableViewCell {

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

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

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

И посмотрите на "self" в отладчике, он показывает, что _earthquakeDateLabel равен "0x12", _earthquakeMagnitudeLabel равен 0x1000, а два других равны нулю.Если я попытаюсь присвоить значение любому из ненулевых значений, я получу нарушение доступа.

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

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


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

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

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

Нет правильного решения

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top