2013-01-15 49 views
3

首先,道歉,如果这是一个相当基本的问题,但我是Objective C的新手,我一直无法在我的所有问题中找到答案搜索(虽然这可能是因为我是一个新手,不太正确地使用正确的术语,而寻找答案!)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 

回答

4

这里的问题是你对这两个变量的定义:

NSString* _blah; 
int _num; 

如果你把它们放在这个文件中,它们被定义为全局变量。所以你班级的每个实例都共享这两个相同的变量。这就是为什么每次你调用你的初始化器时,同一个'_blah'被覆盖。

如果你的意思是他们是实例变量,每个实例都有自己的'_blah'和'_num',那么你需要在你的类的实现或接口中声明它们。所以这将作为一个例子:

@implementation MyObject { 

NSString* _blah; 
int _num; 

} // continue with method definitions... 
+0

Aaargh!完美 - 这样一个简单的答案。非常感谢 – user1979082

相关问题