関数 (またはメソッド) によって返されるもののアドレスを取得することはできません。ivarのアドレスを直接取得する必要があります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 のガイドをご覧になることをお勧めします。