Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在循环中将对象添加到NSMutableArray_Objective C_Ios_Ios4_Nsmutablearray - Fatal编程技术网

Objective c 在循环中将对象添加到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上的问题,那

我无法让NSMutableArray正常工作。我简化了代码以说明我的问题。我有一个类,用作数据容器

@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];