在循环中将对象添加到NSMutableArray

时间:2011-10-30 23:04:55

标签: objective-c ios ios4 nsmutablearray

我在使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上发布问题,那么一切正常。但是,我会错过发布我之前分配的变量,这应该会导致泄漏。

有人知道如何正确地做到这一点吗?

2 个答案:

答案 0 :(得分:1)

很可能你的问题出现在代码的其他地方,内存问题以奇怪的方式暴露自己。您确定没有其他任何内容与questions及其内容互动吗?我建议你在代码中添加一个断点,并在崩溃时探索它的内容。

答案 1 :(得分:-1)

创建问题删除版本时,请改为使用:

Question* question=[[[Question alloc]init] autorelease];

此处使用自动释放池也是一个好主意。