私はアレイ上で反復処理を行い、これらのインスタンス変数を設定できるように、無関係なオブジェクトのインスタンス変数参照を配列に格納します。配列内の任意のインスタンス変数への参照を格納する簡単な方法はありますか?
アレイにメモリアドレスを提供する必要がありますか? like
[arr addObject:&anIvar];
?
私はアレイ上で反復処理を行い、これらのインスタンス変数を設定できるように、無関係なオブジェクトのインスタンス変数参照を配列に格納します。配列内の任意のインスタンス変数への参照を格納する簡単な方法はありますか?
アレイにメモリアドレスを提供する必要がありますか? like
[arr addObject:&anIvar];
?
技術的に言えば、ivarのアドレスを取得してNSArrayにNSNumberに変換して格納することができます。ターゲットオブジェクトとプロパティを対象とし、それらを設定するためにKVCを使用します:それでも、値のペアを格納する方が良いだろう
[myArray addObject:[NSArray arrayWithObjects:self, @"someProperty", nil]];
とAcceccible:
for(NSArray *pairs in myArray) {
[[pairs objectAtIndex:0] setValue:myValue forKey:[pairs objectAtIndex:1]];
}
編集(旧答えでした)。
インスタンス変数へのポインタを取得する最も簡単な方法は、getアクセサーが存在する場合にそれを使用することです。例:
@interface MyClass : NSObject {
UIView* aView; // Protected by default.
}
@property (nonatomic, retain) UIView* aView;
// Elsewhere in the code..
MyClass* myClass = [self getThatObject];
UIView* viewOfMyClass = myClass.aView;
// You may now do what you wish with viewOfMyClass, which is a reference to
// myClass's aView object, including add it to an array for later use.
オブジェクトを構造体として考えると、インスタンス変数へのポインタを取得することがあります。例:aView
はMyClass
の公共インスタンス変数であるため、
@interface MyClass : NSObject {
@public
UIView* aView;
}
// Later, in another part of the code...
MyClass* myClass = [self getThatObject];
UIView* viewOfMyClass = myClass->aView;
viewOfMyClass.tag = 100; // Just changed myClass's aView's tag.
これは動作します。
混乱させたいインスタンス変数が保護されているかプライベートであり、アクセサーがない場合は、少し難しくなります。自分のクラスの場合は、アクセサを追加するだけです。
あなたのクラスでない場合は、このようなポインタを使用した場合、カプセル化を中断するという明確な兆候です。だから私はそれをお勧めしませんが、あなたはまだ巧妙なキャスティングでこの目標を達成することができます。
として、それは私が探しているものではありません。配列内のオブジェクトのインスタンス変数への参照を格納したいので、それらのすべてを繰り返し処理し、値を何かに設定することができます(割り当て可能な値の種類はわかります)。 –
ああ!私はちょうどその誤解を理解した。 おそらく、クラスのメンバーである変数へのポインタが必要だと思います。私は混乱しました。なぜなら、それらは、私が育ったC++の土地の「メンバー変数」で呼び出されたからです。私はObjective-Cの王国で "インスタンス変数"が同じことを意味するようになったばかりです。 – Tyler
KVCはいいですが、配列内のインスタンス変数への参照を直接持つことはできますか? –
はい、[NSNumber numberWithInt:&myivar] – Farcaller