我正在使用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中持久存在?
答案 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];