Как мне установить неинициализированное значение в Objective C?
-
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
.