Добавить объекты в NSMutableArray в цикле - PullRequest
0 голосов
/ 31 октября 2011

У меня проблемы с получением 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 запуск функции выполняется нажатием кнопки на пользовательском интерфейсе. Эта функция должна распечатывать содержание различных вопросов.

Проблема заключается в том, что при запуске функции в вопросах NSMutableArray ранее не сохранялось содержимое, и программа вылетала при

NSLog(@"%d",theQuestion.questionID);

Интересно то, что если я не отпущу вопрос по функции viewDidLoad, то все работает нормально. Однако, я бы пропустил освобождение ранее выделенной переменной, и это должно привести к утечке.

У кого-нибудь есть идеи, как это сделать правильно?

Ответы [ 2 ]

1 голос
/ 31 октября 2011

Вполне возможно, что ваша проблема лежит в другом месте вашего кода, проблемы с памятью выявляются странным образом.Вы уверены, что больше ничего не взаимодействует с questions и его содержимым?Я предлагаю вам добавить точку останова к коду и изучить его содержимое в момент сбоя.

0 голосов
/ 31 октября 2011

При создании вопроса удалите релиз и используйте его вместо:

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

Также было бы неплохо использовать пул авто-релиза здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...