在NSMutableArray中存储对象时出现问题

时间:2009-03-27 08:37:00

标签: iphone objective-c cocoa

我正在使用iPhone进行开发,而且我遗漏了一些关于在NSMutableArray中存储对象的内容 - 我做错了什么,我应该如何解决这个问题?

代码的相关部分是

我有一个定义的对象Entity,它直接从NSObject继承。在我的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函数的主体中 - 由timer事件多次调用 - 我分配数组,并且,对于初始开发,只有一个Entity对象并将其添加到数组

- (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并将实体实例添加到其中,然后在正文中指向存储在所检索的数组中的第一个实体副本的指针,这种操纵(显然我打算添加更多并稍后循环它们)。

然而,在第一次调用该过程时,一切正常,objectAtIndex检索实体指针并且所有工作都会发生。但是,在第二次调用时controllerSetup为真并且未执行初始化子句arrEntities为空且程序崩溃,因为objectAtIndex检索为nil。

那么我做错了什么?为什么我存储的Entity对象不会在NSMutableArray中持久存在?

2 个答案:

答案 0 :(得分: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 :(得分:-1)

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