Ошибка EXC_BAD_ACCESS с получателем

#ios #objective-c #exc-bad-access

#iOS #objective-c #исключение-bad-access

Вопрос:

Я получил эту ошибку при загрузке моего вторичного представления (и попытке получить переменную weight из контроллера модального представления):

 EXC_BAD_ACCESS (code=2, address=0x0)
  

Это строка, выделенная XCode (из modalViewController.m):

 - (CGFloat)getWeight {
    return *(weight);
}
  

Но проблема заключается в этой строке кода в методе viewDidAppear (если я ее закомментирую, она отлично работает) (из ViewController.m):

 -(void)viewDidAppear:(BOOL)animated {
    [_showModalViewButton setTitle:[NSString stringWithFormat:@"%f",[modalViewController     getWeight]] forState:UIControlStateNormal];
}
  

Когда приведенная выше строка кода была в viewDidLoad, она работала нормально, но мне нужно, чтобы заголовок UIButton обновлялся каждый раз при появлении дополнительного представления

(Я надеюсь, что это простое исправление, но я очень новичок в разработке iOS)

Комментарии:

1. почему вы отменяете ссылку на переменную weight в вашем методе getter?

2. Что вы имеете в виду? Я хотел ввести ‘return weight;’, но я получил ошибку, и Xcode исправил ее на ‘* (вес)’

3. какого типа weight ?

4. weight является ли CGFloat iVar объявленным в modalViewController.h

Ответ №1:

Наиболее вероятная причина ваших проблем заключается в том, что вы объявили, что у weight вас есть тип CGFloat * вместо просто CGFloat .

Измените любые ссылки на CGFloat * на CGFloat .

Затем измените свой getWeight метод, чтобы просто сделать:

 return weight;
  

Комментарии:

1. Не могли бы вы объяснить разницу между ними?

2. Один, если ссылка на примитивный тип CGFloat , а тот, что со звездочкой, является указателем на примитивный тип CGFloat . При обычном использовании вы используете указатели только с объектами, а не с примитивными типами.

Ответ №2:

Вы получаете эту ошибку, потому что пытаетесь получить доступ к несуществующей переменной (отсюда и адрес 0x0). Доступ к свойству в получателе осуществляется через _weight , которое ссылается на ivar.

Комментарии:

1. Если бы это была несуществующая переменная, она бы не компилировалась. И у ivar не обязательно должно быть имя _weight , это может быть weight , если именно так было синтезировано свойство. В OP даже указано, что weight это ivar. Никакое свойство не задействовано.