まったく同じだと思っていたものに対して、2 つの非常に異なる動作が見られます。
次のように、クラス拡張でプライベート メンバーを定義します。
@interface ClassA ()
@property ClassB* b;
@end
@implementation ClassA
-(ClassA*)initWithClassB:(ClassB*)newB
{
self.b = newB;
return self;
}
-(ClassB*)getB
{
return self.b;
}
または、クラス実装でプライベート メンバーを次のように定義します。
@interface ClassA ()
@end
@implementation ClassA
ClassB* b;
-(ClassA*)initWithClassB:(ClassB*)newB
{
b = newB;
return self;
}
-(ClassB*)getB
{
return b;
}
私がこのコードを使用している方法は、ClassB オブジェクトを作成し、その ClassB オブジェクトで ClassA オブジェクトを初期化し、次に ClassA オブジェクトを可変配列に追加することです。
-(void)init
{
self.classAList = [[NSMutableArray alloc] init];
[self.classAList addObject:[[ClassA alloc] initWithClassB:[self createClassB1]]];
[self.classAList addObject:[[ClassA alloc] initWithClassB:[self createClassB2]]];
[self.classAList addObject:[[ClassA alloc] initWithClassB:[self createClassB3]]];
}
-(ClassB)createClassB1
{
ClassB* classB = new ClassB();
//do some init
return classB;
}
// Same thing fore createClassB2 and createClassB3 except with different data
最初のアプローチを使用して、インターフェイス拡張でメンバーを定義すると、可変配列の各要素が実際に期待どおりであることがわかります。
ただし、2 番目の方法を使用するClassB* b
と、オブジェクト内のポインターがClassA
常に最後に作成されたオブジェクトを指していることがわかりClassB
ます。つまり、-(void)init
メソッドが終了すると、ClassB
各オブジェクトのポインターは、作成しClassA
たオブジェクトを指します。ClassB
createClassB3
ここで何が起きてるの?
また、ClassB オブジェクトは C++ オブジェクトであり、これは目的の C++ クラスであることにも言及する必要があります。