我在使NSMutableArray工作时遇到问题。我简化了用于说明问题的代码。我有一个类,我用它作为数据容器。
@interface Question : NSObject {
int questionID;
NSString* text;
}
@property int questionID;
@property(nonatomic,retain)NSString* text;
@end
我正在创建此容器的不同实例,如下所示:
·H
#import "Question.h"
@interface testViewController : UIViewController {
NSMutableArray* questions;
}
-(IBAction) start;
的.m
...
- (void)viewDidLoad {
[super viewDidLoad];
questions=[[NSMutableArray alloc]init];
for (int i=0; i<5; i++) {
int questionID=i;
Question* question=[[Question alloc]init];
question.questionID=questionID;
question.text=[NSString stringWithFormat:@"text %d",i];
[questions addObject:question];
[question release];
}
}
..........
-(IBAction) start{
for (int i=0; i<[questions count]; i++) {
Question *theQuestion;
theQuestion=(Question*)[questions objectAtIndex:i];
NSLog(@"%d",theQuestion.questionID);
NSLog(@"%@",theQuestion.text);
NSLog(@"----------------------");
}
}
在ViewDidLoad中,问题的实例是在循环中创建的,并且它们被添加到NSMutableArray问题中。问题被添加后,它被释放。在填充NSMutableArray之后,通过按下UI上的按钮来执行功能启动。此功能应打印出不同问题的内容。
问题是当执行函数启动时,NSMutableArray问题没有存储之前的内容并且程序崩溃
NSLog(@"%d",theQuestion.questionID);
有趣的是,如果我不在函数viewDidLoad上发布问题,那么一切正常。但是,我会错过发布我之前分配的变量,这应该会导致泄漏。
有人知道如何正确地做到这一点吗?
答案 0 :(得分:1)
很可能你的问题出现在代码的其他地方,内存问题以奇怪的方式暴露自己。您确定没有其他任何内容与questions
及其内容互动吗?我建议你在代码中添加一个断点,并在崩溃时探索它的内容。
答案 1 :(得分:-1)
创建问题删除版本时,请改为使用:
Question* question=[[[Question alloc]init] autorelease];
此处使用自动释放池也是一个好主意。