【问题标题】:Objective-C: changing object inside NSMutableArrayObjective-C:更改 NSMutableArray 中的对象
【发布时间】:2010-03-05 06:11:47
【问题描述】:

在我的程序中,我有两个类:收集器和实体。收集器将实体存储在 NSMutableArray 中。

@interface Entity : NSObject {
    ...
}

@interface Collector : NSObject {
    NSMutableArray *entities;
    uint someInt;
    ...
}
- (void)addEntity:(Entity*)newEntity;   // implemented as [entities addObject:newEntity];

收集器也存储在 NSMutableArray 中(我们称之为收集器)。然后我有这样的代码(类似这样):

for (uint i = 0; i < [collectors count]; i++) {
    Collector *curCollector = [[collectors objectAtIndex:i] retain];

    Entity *curEntity = [[Entity alloc] init];
    [curCollector addEntity:curEntity];
    [curCollector setSomeInt:50];

    [curEntity release];
    [curCollector release];
}

执行此代码部分后,收集器内没有新实体,但 someInt 值正确更改。此外,当我调试代码时,在释放变量之前的步骤中,curCollector 包含新实体并具有地址,与收集器数组中的对象之一相同,但该对象(在收集器数组中)没有实体。

我做错了什么?

附:
在调试期间,我检查了所有对象 - 没有找到 nil(尤其是实体)。
关于 addObject - 所有实现代码都是[entities addObject:newEntity];
另一个有趣的事情(在我上面的解释中指出)- int 值设置正确(收集器数组的对象包含 someInt == 50)。

附: 我在发布代码部分之前添加了一行:

[collectors replaceObjectAtIndex:i withObject:curCollector];

没有结果!!

【问题讨论】:

  • curCollector 不可能有一个实体,而收集器条目如果它们是同一个对象则没有实体(我认为你是这样说的)。
  • 我不知道。也许仔细看看方法 addEntity:.
  • 还要确保您的实体成员不为零。听起来它不是基于您的 cmets,但这可能是问题所在(没有更多代码很难判断)。
  • 2nall:它们是一样的。在调试期间,我添加了一个断点并观察它们的内存地址。我看到了平等的价值观!甚至在发布之前(甚至之后)... 2yehnan: [entities addObject:newEntity]; - 这就是 2nail:再检查一次(在调试器中)没有 nils
  • 你也不需要保留/释放curCollector:它会在循环结束时自动超出范围并被销毁。

标签: objective-c inheritance object nsmutablearray


【解决方案1】:

嗯。很抱歉浪费了您的时间...此代码中没有错误。
这段代码(当然)是程序的一部分。并且在一些步骤之后发现了错误。
调试过程中的问题是由 XCode 调试器引起的,它无法深入查看类的内容。我的意思是实体在实体数组中。该数组在收集器内部,而该收集器在收集器数组本身内部。当我尝试将实体数组获取到某个局部变量时,返回的数组有实体(显示在 XCode 调试器中)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    相关资源
    最近更新 更多