Вы не можете получить адрес чего-либо, возвращенного функцией (или методом). Вам необходимо получить адрес ивара color
напрямую (т.е. &color
). Однако в вашем случае я рекомендую использовать предложенный вами подход (id tempCol = self.color; [NSValue value:&tempCol];
).
Обратите внимание, что метод вызывается при использовании точечной нотации.
self.color
// is equal to
[self color]
&([self color])
также невозможно, поскольку &
разрешается во время компиляции, а не во время выполнения. Возвращаемые значения [self color]
и self.color
(которые равны) еще не известны во время компиляции (даже при использовании @synthesize
, поскольку вы можете изменить реализацию метода в Objective-C во время выполнения (например, с помощью метода извращение или использование категорий)).
Кажется, вы не до конца понимаете, что делает @synthesize
, поэтому я объясню. :)
По сути, @synthesize
делает следующее: компилятор генерирует методы и их реализации из заданных имен свойств.
Например, это свойство:
@property(nonatomic, retain) NSColor *color;
Вместе с этим синтезом:
@synthesize color;
Вставит этот код для вас в @implementation
:
- (NSColor *)color {
return color;
}
- (void)setColor:(NSColor *)newColor {
if (color == newColor) { return; }
NSColor *theOldColor = color;
color = [newColor retain];
[theOldColor release];
}
Когда вы хотите использовать свой собственный установщик или получатель, вы просто определяете их в @implementation
, используя те же имена методов. Например, вы можете вернуть цвет по умолчанию, если он еще не установлен:
- (NSColor *)color {
if (color) { return color; }
return [NSColor whiteColor];
}
Теперь компилятор будет генерировать установщик, но не получатель: он будет использовать предоставленный вами получатель, вы все равно можете использовать его с self.color
.
Возможно, вы захотите взглянуть на Руководство Apple по свойствам .