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