Краткое резюме:
Быстрый ответ здесь заключается в том, что здесь нет противоречия, поскольку результат выражения:
(mcInst.foobar = @"BAZ!")
на самом деле @"BAZ!"
и not mcInst.foobar
.
Более подробная информация доступна ниже, но может помочь рассмотреть следующую модификацию вашего setFoobar
метода:
- (void) setFoobar:(NSString*)fbSet
{
[_foobar release];
_foobar = [[NSString stringWithFormat:@"HELLO_%@", fbSet] retain];
}
При наличии этого кода значение свойства foobar
изменяется во время его установки, , но ваша строка кода будет по-прежнему отображать значение 'BAZ!' .
Подробности:
Как указано newacct , ваш код NSLog работает, потому что вы используете оператор присваивания (=), который имеет очень специфическое поведение в языке Си (на чем основан Objective-C)
В C вы можете сделать следующее:
x = y = z = 42;
и все переменные x
, y
и z
будутудерживайте значение 42.
Компилятор обрабатывает это поведение с помощью временной переменной (*).По сути, то, что происходит за кулисами, выглядит примерно так:
tempVar = 42;
z = tempVar;
y = tempVar;
x = tempVar;
В том же ключе вы можете сделать следующее:
SomeFunction(x = 42);
эта строка кода скопирует значение42 в x, а затем вызовите SomeFunction
с аргументом 42. За кулисами это выглядит так:
tempVar = 42;
x = tempVar;
SomeFunction(tempVar);
Теперь в Objective-C ваша строка регистрации обрабатывается следующим образом:
tempVar = @"BAZ!";
[mcInst setFooBar:tempVar];
NSLog(@"I set 'foobar' to '%@'", tempVar);
(*) обратите внимание, что использование «временной переменной», которую я описываю, предназначено для иллюстрации концепции и может не отражать того, что на самом деле делает любой данный компилятор.Такой тип реализации зависит от программистов, которые пишут компилятор, и каждый может делать что-то свое.Однако конечный результат тот же.