次のようなプロパティがある場合:
@property(strong, readwrite, nonatomic) NSDate* aProperty;
参照を別のメソッドに渡したいのですが、これらは正しいですか:
if([AnotherClass aMethod:&(self.aProperty)]) { ...
if([AnotherClass aMethod:&self.aProperty]) { ...
次のようなプロパティがある場合:
@property(strong, readwrite, nonatomic) NSDate* aProperty;
参照を別のメソッドに渡したいのですが、これらは正しいですか:
if([AnotherClass aMethod:&(self.aProperty)]) { ...
if([AnotherClass aMethod:&self.aProperty]) { ...
あなたの例を考えてみましょう:
if ([AnotherClass aMethod:&(self.aProperty)]) { ...
ドット表記は事実上、ゲッターアクセサーメソッドを使用しているため、これは明らかに機能しません。これは次と同等です。
if ([AnotherClass aMethod:&[self aProperty]]) { ...
コンパイラがこの表記について少し混乱している理由は簡単に想像できます。論理的な代替手段は、ivarを参照することです。したがって、(プロパティのivarにアンダースコア規則を使用していると仮定すると)次のようになります。
if ([AnotherClass aMethod:&_aProperty]) { ...
しかし、これにはあらゆる種類の問題があります(setterのバイパス、ここで説明するようにデフォルトをオーバーライドするための属性のaMethod
必要性に関する問題など)。__strong
__autoreleasing
したがって、おそらく最善の方法は、更新を受け取るローカル変数を用意し、その後にプロパティのセッターを呼び出すことです。
NSDate *date;
if ([AnotherClass aMethod:&date]) { ...
self.aProperty = date;
KeyValue コーディングを使用できます。
プロパティの名前を NSString として送信するだけです
- (void) method:(NSString*)propertyName
{
[self setValue:[NSNumber numberWithInt:2] forKey:propertyName];
}
また、プロパティはメソッド (set と get) だけなので、セレクターを渡すことができます
SEL selector = @selector(setProperty:);
- (void) method:(SEL)selector target:(id)target
{
[target performSelector:selector withObject:[NSNumber numberWithInt:2]];
}
キー値コーディングを使用することを好みます。
aProperty
はすでに NSDate オブジェクトへのポインターであるため、「参照による呼び出し」のためにポインター値を渡すだけです。
アイテムはポインターとして宣言されているため、次を使用して参照を渡すことができます。
if([AnotherClass aMethod:aProperty]) { ...
aMethod のプロトタイプは...
- (BOOL) aMethod:(NSDate *) aParameter;
(プロパティ自体へのポインターを本当に渡したい場合を除いて、上記は当てはまります-プロパティ自体へのポインターを変更します。その場合、私はあなたの設計に疑問を投げかけます)