我正在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 的第一次调用将被设置并且Entity的实例被添加到它,然后在正文中指向存储在数组中的实体的第一副本的指针被检索并且这被操纵(显然我打算添加更多,并在以后循环它们).
然而,在程序的第一次调用中,一切正常,objectAtIndex
检索实体指针并且所有工作都会发生什么.但是在第二次调用时,如果controllerSetup
为true且未执行的初始化子句arrEntities
为空,则程序崩溃为objectAtIndex
检索nil.
那么我做错了什么?为什么我存储的Entity对象不会在NSMutableArray中持久存在?
尝试使用以下内容替换您创建arrEntities的行:
arrEntities = [[NSMutableArray alloc] init];
然后确保将其添加到dealloc方法:
- (void)dealloc { [arrEntities release]; [super dealloc]; }
基本上,因为你没有明确地分配你的数组(你使用的是静态+数组方法),所以它是自动释放的.当阵列已自动释放并且您的代码尝试访问它时,您的程序崩溃.
还有一件事:
Entity* thisEntity = [[Entity alloc] initEntity]; [arrEntities addObject:thisEntity]; [thisEntity release]; // add this
如果你不释放thisEntity,它将泄漏.addObject保留传递的对象.