Objective C数组元素的值最终都相同

3
首先,如果这是一个基本问题,我要道歉,因为我是Objective C的新手,在所有搜索中都没有找到答案(尽管这可能是因为我是个新手,没有使用正确的术语来寻找答案!)
我有一个简单的循环,在其中用一些自定义对象填充NSMutableArray。我发现,在循环之后,我的数组的元素似乎都具有相同的值:即在插入(0,1,2,3)之后,我的数组包含(3,3,3,3)。
只有在使用我的对象时才存在问题;第二个数组,其中仅添加字符串,最终被填充了预期的值。
查看我的数组中对象的地址,我发现它们都不同:我是否正确地认为这意味着我不仅仅有一个引用相同对象的指针数组?
我想了解为什么它没有按照我的预期行事。我有一种感觉,我错过了一些非常基础的东西,任何见解都将不胜感激。
这是我执行的循环:
- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLog(@"STARTING");
    NSMutableArray* myArray1 = [NSMutableArray array];
    NSMutableArray* myArray2 = [NSMutableArray array];

    for (int i=0; i < 4; i++) {
        MyObject* obj = [[MyObject alloc] initWithSomeString: [NSString stringWithFormat: @"ID%u", i] 
                                                  AndSomeNum: i];
        [myArray1 addObject: obj];
        [myArray2 addObject: [NSString stringWithFormat: @"ID%u", i]];

        NSLog(@"  Added to array1: %@", [myArray1 objectAtIndex: i]);
        NSLog(@"       and array2: %@", [myArray2 objectAtIndex: i]);
    }

    NSLog(@"ALL DONE:\nARRAY1=%@\nARRAY2=%@", myArray1, myArray2);
}

我运行后得到的输出是:
STARTING
   Added to array1: num=0 self=<0x928e9b0> str=<0x9290090> str=ID0
        and array2: ID0
   Added to array1: num=1 self=<0x9290080> str=<0x928ff80> str=ID1
        and array2: ID1
   Added to array1: num=2 self=<0x928eb00> str=<0x9290020> str=ID2
        and array2: ID2
   Added to array1: num=3 self=<0x7499a30> str=<0x7499ae0> str=ID3
        and array2: ID3
ALL DONE:
ARRAY1=(
    "num=3 self=<0x928e9b0> str=<0x7499ae0> str=ID3",
    "num=3 self=<0x9290080> str=<0x7499ae0> str=ID3",
    "num=3 self=<0x928eb00> str=<0x7499ae0> str=ID3",
    "num=3 self=<0x7499a30> str=<0x7499ae0> str=ID3"
)
ARRAY2=(
    ID0,
    ID1,
    ID2,
    ID3
)

这是MyObject类的实现:
@implementation MyObject

NSString* _blah;
int _num;

-(MyObject*)initWithSomeString: (NSString*)blah AndSomeNum: (int)num {
    self = [super init];
    _blah = [NSString stringWithString: blah];
    _num = num;
    return self;
}

-(NSString*)description {
    return [NSString stringWithFormat: @"num=%u self=<%p> str=<%p> str=%@", _num, self, _blah, _blah];
}

@end
1个回答

4
这里的问题在于您对这两个变量的定义:
NSString* _blah;
int _num;

在该文件中,您将它们放置在全局变量中。因此,您的每个类实例都共享这两个变量。这就是为什么每次调用初始化程序时都会覆盖相同的“_blah”的原因。

如果您希望它们成为实例变量,每个实例都有自己的“_blah”和“_num”,那么您需要在类的实现或接口中使用{}声明它们。以下是一个示例:

@implementation MyObject {

 NSString* _blah;
 int _num;

} // continue with method definitions...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接