Objective c 在循环中将对象添加到NSMutableArray
我无法让NSMutableArray正常工作。我简化了代码以说明我的问题。我有一个类,用作数据容器Objective c 在循环中将对象添加到NSMutableArray,objective-c,ios,ios4,nsmutablearray,Objective C,Ios,Ios4,Nsmutablearray,我无法让NSMutableArray正常工作。我简化了代码以说明我的问题。我有一个类,用作数据容器 @interface Question : NSObject { int questionID; NSString* text; } @property int questionID; @property(nonatomic,retain)NSString* text; @end 我正在创建此容器的不同实例,如下所示: h m 有趣的是,如果我不发布函数viewDidLoad上的问题,那
@interface Question : NSObject {
int questionID;
NSString* text;
}
@property int questionID;
@property(nonatomic,retain)NSString* text;
@end
我正在创建此容器的不同实例,如下所示:
h
m
有趣的是,如果我不发布函数viewDidLoad上的问题,那么一切都正常。然而,我会错过释放我以前分配的变量,这将导致泄漏
有人知道如何正确地做到这一点吗 在创建问题时,删除发布并使用此选项:
Question* question=[[[Question alloc]init] autorelease];
在这里使用自动释放池也是一个好主意。很可能您的问题存在于代码的其他地方,内存问题以奇怪的方式暴露出来。你确定没有其他东西与问题及其内容相互作用吗?我建议您在代码中添加一个断点,并在崩溃点探索其内容。问题的内存处理很好-autorelease不会以很小的性能损失为代价增加任何好处。我用autorelease尝试过,它也会崩溃。我唯一的办法就是删除[question release]行。但是,我不喜欢从内存管理的角度来看,在将问题添加到数组之后,但在释放它之前,请尝试一下NSLog@retainCount%i,question.retainCount;确认它是2,因为在那一点上它应该是。我只是试着打印重新计数,在第一次迭代时它打印2。当我进一步循环时,它增加到3,4,等等。这很奇怪,因为我在每次迭代中分配问题。根据我的理解,在整个循环中应该保持在2,不是吗?在旁注中,你应该避免这样做:I点darren。我只是很快地写了这篇文章来说明我的问题。我会考虑的。你是否覆盖了等质量问题?非常奇怪的是,当我在崩溃前检查问题的内容时,我在数组中没有看到任何有用的东西。但是,如果我只是删除保留行,那么内容就可以了,但是我不愿意留下一些未发布的内容。我建议您让LLVM静态分析器告诉您哪里做错了-我怀疑问题出在代码的其他地方。从产品>分析中调用它。感谢Benjie的建议。我只是使用build&analyze运行静态分析器,没有从中得到任何错误或提示。事实上,在一个更大的项目中工作之后,我写了这个小程序来说明我的问题。实际上没有那么多代码。我确信这是一件微妙的事情,但我现在还看不到
- (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(@"----------------------");
}
}
NSLog(@"%d",theQuestion.questionID);
Question* question=[[[Question alloc]init] autorelease];