Передающие аргументы значением или ссылкой в цели C

Я являюсь довольно новым с целью c, и я пытаюсь передать аргумент ссылкой, но веду себя как она, было значение. Вы знаете, почему это не работает?

Это - функция:

- (void) checkRedColorText:(UILabel *)labelToChange {
    NSComparisonResult startLaterThanEnd = [startDate compare:endDate];
    if (startLaterThanEnd == NSOrderedDescending){
        labelToChange.textColor = [UIColor redColor];
    }
    else{
        labelToChange.textColor = [UIColor blackColor];
    }

}

И это - вызов:

UILabel *startHourLabel; // This is properly initialized in other part of the code
[self checkRedColorText:startHourLabel];

Спасибо за помощь

23
задан Community 13 February 2018 в 10:13
поделиться

3 ответа

В objective-c нет возможности передавать объекты по значению (если вы явно не скопируете его, но это уже другая история). Пощупайте свой код - вы уверены, что вызывается checkRedColorText:? А как насчет [startDate compare: endDate], он никогда не равен NSOrderedDescending? Значение labelToChange равно нулю?

0
ответ дан 29 November 2019 в 00:45
поделиться

Вот Возможные причины того, почему это не работает:

  1. метка, которую вы передаете в checkRedColorText, не та, которую вы думаете.
  2. результат сравнения всегда получается одинаковым.
  3. ... на самом деле нет 3.

Вы утверждаете, что инициализировали startHourLabel где-то еще, но, если это метка из файла пера, вы не должны инициализировать его вообще. Он должен быть объявлен как IBOutlet и подключен к метке в пере с помощью конструктора интерфейсов.

Если это не метка в пере, т.е. вы намеренно создаете ее программно, вам необходимо проверить адрес метки, которую вы инициализируете, и проверить адрес метки, переданной в checkRedColorText. Либо NSLog его адрес при инициализации и в checkRedColorText, либо проверьте его с помощью отладчика.

0
ответ дан 29 November 2019 в 00:45
поделиться

Вы редактировали код между этой строкой

UILabel *startHourLabel;

и этой строкой?

[self checkRedColorText:startHourLabel];

Если нет, проблема в том, что вы: повторное объявление вашей переменной startHourLabel , поэтому вы теряете любую инициализацию, которая была там ранее. Здесь вы должны получить ошибку компилятора.

0
ответ дан 29 November 2019 в 00:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: