Проблема хранения объектов в NSMutableArray - PullRequest
4 голосов
/ 27 марта 2009

Я занимаюсь разработкой на iPhone и что-то упускаю из-за сохранения объектов в NSMutableArray - что я делаю неправильно и как мне к этому подойти?

Соответствующие разделы кода:

У меня есть объект Entity, который наследуется непосредственно от NSObject. В моем классе GLView я хочу определить массив этих - так GLView.h

@interface GLView : UIView
{
    BOOL controllerSetup;

    // Entity etc - first development task it to get one up
    NSMutableArray *arrEntities;
}
@property(nonatomic, assign) NSMutableArray *arrEntities;

и в теле функции drawView, которая вызывается событием таймера несколько раз, я выделяю массив и, для начальной разработки, только один объект Entity и добавляю его в массив

- (void)drawView
{
    if(!controllerSetup) { // initialize on first call
        [controller setupView:self];
        controllerSetup = YES;

        arrEntities = [NSMutableArray array];

        Entity* thisEntity = [[Entity alloc] initEntity];   
        [arrEntities addObject:thisEntity];
    }
    Entity *entity = [arrEntities objectAtIndex:0];
    [entity tickEntity:0.1];
}

Насколько я понимаю, при первом вызове drawView будет установлен NSMutableArray и к нему будет добавлен экземпляр Entity, затем в теле указатель на первую копию объекта, сохраненную в извлеченном массиве, и этим манипулируют (очевидно, я собираюсь добавить еще и зациклить их позже).

Однако что происходит, когда при первом вызове процедуры все работает нормально, objectAtIndex получает указатель сущности и все работает. Однако при втором вызове, когда значение controllerSetup истинно, а условие инициализации не выполнено, arrEntities пусто, и программа вылетает, когда objectAtIndex возвращает ноль.

Так что я делаю не так? Почему мой сохраненный объект Entity не сохраняется в NSMutableArray?

Ответы [ 2 ]

8 голосов
/ 27 марта 2009

Попробуйте заменить созданную вами строку arrEntities следующим:

arrEntities = [[NSMutableArray alloc] init];

Затем добавьте его в метод dealloc:

- (void)dealloc
{
     [arrEntities release];
     [super dealloc];
}

По сути, поскольку вы не выделяете массив массивом (вы используете метод static + array), он автоматически освобождается. Ваша программа падает, когда массив был автоматически освобожден, и ваш код пытается получить к нему доступ.

Еще одна вещь:

Entity* thisEntity = [[Entity alloc] initEntity];   
[arrEntities addObject:thisEntity];
[thisEntity release]; // add this

Если вы не отпустите thisEntity, оно будет вытекать. addObject сохраняет переданный объект.

0 голосов
/ 27 марта 2015
Entity* thisEntity = [[Entity alloc] init];   
[arrEntities addObject:thisEntity];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...