NSMutableArray中存储对象的问题

4

我在iPhone上开发,并且在存储对象到NSMutableArray上遇到了问题,我做错了什么?应该如何解决?

相关代码段:

我定义了一个继承自NSObject的对象Entity。在GLView类中,我希望定义一个这些对象的数组 - 所以在GLView.h中。

@interface GLView : UIView
{
    BOOL controllerSetup;

    // Entity etc - first development task it to get one up
    NSMutableArray *arrEntities;
}
@property(nonatomic, assign) NSMutableArray *arrEntities;

在drawView函数的主体中,该函数被定时器事件多次调用。我会分配数组,并添加一个实体对象到数组中,这是初步开发的过程。

- (void)drawView
{
    if(!controllerSetup) { // initialize on first call
        [controller setupView:self];
        controllerSetup = YES;

        arrEntities = [NSMutableArray array];

        Entity* thisEntity = [[Entity alloc] initEntity];   
        [arrEntities addObject:thisEntity];
    }
    Entity *entity = [arrEntities objectAtIndex:0];
    [entity tickEntity:0.1];
}

我的理解是,在第一次调用 drawView 时,NSMutableArray 将被设置并添加一个 Entity 实例,然后在方法体中从数组中检索存储的第一个实体的指针进行操作(显然我打算添加更多并稍后循环执行)。
然而,在过程的第一次调用中,一切正常运行,objectAtIndex 检索实体指针并且所有工作正常。但是,在第二次调用时,当 controllerSetup 为 true 并且初始化语句未被执行时,arrEntities 为空,并且程序会崩溃,因为 objectAtIndex 检索到 nil。
所以,我做错了什么?为什么我的存储的 Entity 对象无法持久存在 NSMutableArray 中?
2个回答

8

尝试将您创建arrEntities的行替换为以下内容:

arrEntities = [[NSMutableArray alloc] init];

然后确保将其添加到dealloc方法中:

- (void)dealloc
{
     [arrEntities release];
     [super dealloc];
}

基本上,由于您没有明确分配数组(您正在使用静态+数组方法),因此它正在自动释放。当数组已被自动释放且您的代码尝试访问它时,您的程序会崩溃。

还有一件事:

Entity* thisEntity = [[Entity alloc] initEntity];   
[arrEntities addObject:thisEntity];
[thisEntity release]; // add this

如果你不释放这个实体,它就会泄露。addObject会保留传递的对象。


-1
Entity* thisEntity = [[Entity alloc] init];   
[arrEntities addObject:thisEntity];

1
请不要仅仅把代码丢在那里,您需要解释您所做的事情。这是一个差劲的答案。 - arco444

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