В следующем коде:
_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;
хорошо работает.
_imageView.hashorizontalscroller = Да;
- В этой строке вы доступаете в свойство в ImageView - поэтому вы на самом деле не доступа к значению, но вызовите Setter метод:
[_imageView setHasHorizontalScroller:YES]; // Equivalent of your code.
во втором примере вы также получаете доступ Свойство, но на этот раз метод Getter вызывается и возвращает BoOL. Таким образом, как точки MiPadi вам не нужно использовать и
в этом операторе NSLog.
Я предложил прочитать документы о свойств в OBJ-C.
Редактировать: здесь Вы можете найти обсуждение о том, почему свойства работают в нескольких операторах назначения, как вы упомянули:
BOOL b = _imageView.hasVerticalScroller = YES;
Я не на 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);