对于我认为完全相同的事情,我看到了两种截然不同的行为。
在类扩展中定义我的私有成员,如下所示:
@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
当我使用第一种方法并在接口扩展中定义我的成员时,我看到可变数组中的每个元素确实是我所期望的。
但是,使用第二种方法,我看到我ClassB* b
在对象中的指针ClassA
总是指向最近创建的ClassB
对象。也就是说,一旦-(void)init
方法完成,每个对象中的ClassB
指针都会指向我在其中创建的对象ClassA
ClassB
createClassB3
这里发生了什么?
我还应该提到 ClassB 对象是一个 C++ 对象,这是一个 Objective-C++ 类。