"РАЗВЕ" “LValue” не означает то, что я думаю, что это означает?

В следующем коде:

_imageView.hasHorizontalScroller = YES;
_imageView.hasVerticalScroller = YES;
_imageView.autohidesScrollers = YES;

NSLog(@"scrollbar? H %p V %p hide %p", 
      &(_imageView.hasHorizontalScroller), 
      &(_imageView.hasVerticalScroller),
      &(_imageView.autohidesScrollers));

Я получаю ошибку:

Controller.m:143: error: lvalue required as unary '&' operand
Controller.m:144: error: lvalue required as unary '&' operand
Controller.m:145: error: lvalue required as unary '&' operand

Заметьте, что я ИСПОЛЬЗУЮ те переменные как lvalues непосредственно перед и строки...

Как это может жаловаться, что значение не является lvalue правом после того, как я присваиваю ему без ошибки? это имеет отношение к волшебным методам считывания/методам set, которые создает цель C?

Я думаю, что должен объяснить некоторый контекст для объяснения, ПОЧЕМУ я пытаюсь получить адрес:

в моем предыдущем ТАК сообщение, я показал тот же код, печатая %d и найдя, что после присвоений, свойства были все еще 0 по некоторым причинам. Так, я полагал, что попытаюсь заставить адреса свойств видеть, где они хранятся, и возможно я могу выяснить, почему я успешно не присваиваю им, и затем это произошло.

Я думаю, что, поскольку люди упомянули, да, это, вероятно, что, когда я, присвоение obj-c тайно заменяет это вызовом к методу set (и затем некоторое другое волшебство, потому что в другом, ТАК отправьте, кто-то еще упомянул это

BOOL b = [_imageView setHasVerticleScroller: YES]

сбои, но

BOOL b = _imageView.hasVerticalScroller = YES;

хорошо работает.

5
задан Brian Postow 14 January 2010 в 16:47
поделиться

2 ответа

_imageView.hashorizontalscroller = Да; - В этой строке вы доступаете в свойство в ImageView - поэтому вы на самом деле не доступа к значению, но вызовите Setter метод:

[_imageView  setHasHorizontalScroller:YES]; // Equivalent of your code.

во втором примере вы также получаете доступ Свойство, но на этот раз метод Getter вызывается и возвращает BoOL. Таким образом, как точки MiPadi вам не нужно использовать и в этом операторе NSLog.

Я предложил прочитать документы о свойств в OBJ-C.

Редактировать: здесь Вы можете найти обсуждение о том, почему свойства работают в нескольких операторах назначения, как вы упомянули:

BOOL b = _imageView.hasVerticalScroller = YES;
2
ответ дан 14 December 2019 в 19:15
поделиться

Я не на 100% уверен, но я собираюсь взять на себя удар в ответ.

Эти свойства - все BOOL типов , которые есть (я считаю) AN unsigned Char в объекте. (Может быть, INT , я не могу вспомнить, но это что-то подобное.) Итак, вы пытаетесь взять адрес ( & ) этих свойств. Но вы на самом деле не доступа к иверам напрямую; Свойства проходят через вызов метода, чтобы получить их значения. Таким образом, вы пытаетесь получить адрес в Bool возвращаемого значения метода, но поскольку вы на самом деле не назначаете значение на что-нибудь, нет адреса - вы Просто иметь значение.

У вас будет та же проблема, если вы сделали это:

static int returnOne(void)
{
    return 1;
}

// Later...

NSLog(@"returnOne is %p", &returnOne());    // Oops, the return value of returnOne has no address!

Ваш журнал должен выглядеть так:

NSLog(@"scrollbar? H %d V %d hide %d", 
  _imageView.hasHorizontalScroller, 
  _imageView.hasVerticalScroller,
  _imageView.autohidesScrollers);
3
ответ дан 14 December 2019 в 19:15
поделиться
Другие вопросы по тегам:

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