iphone - Objective C 数组元素都以相同的值结束

标签 iphone objective-c xcode arrays

首先,如果这是一个相当基本的问题,我深表歉意,但是我是 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

最佳答案

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

NSString* _blah;
int _num;

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

如果您想让它们成为实例变量,每个实例都有自己的“_blah”和“_num”,那么您需要在类的实现或接口(interface)中的 {} 内声明它们.所以这可以作为一个例子:

@implementation MyObject {

 NSString* _blah;
 int _num;

} // continue with method definitions...

关于iphone - Objective C 数组元素都以相同的值结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14331118/

相关文章:

ios - 如何连续改变每个节拍音乐的单个方 block 颜色以在 iPhone 中制作可视化工具?

objective-c - 是否可以在 Objective-C 扩展中定义 ivars?

ios - 无法将 RGB 转换为 UIColor

xcode - 防止项目在某些条件下成功编译

xcode - 将 Swift 应用程序分解为框架

ios - 推送通知在 iPhone 3GS 中不起作用。它适用于最新的 IOS 设备,如 iPhone 4、4s、5

ios - 在 ios7 中更新推送通知的角标(Badge)计数

ios - 尝试向 Core Data 添加新记录时出错

iphone - 如何验证字符串是否为字母数字

ios - iOS,如何为有趣的应用程序划粗线?