【发布时间】: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