Объекты в NSArray, устанавливаемые в ноль в ARC - PullRequest
0 голосов
/ 02 января 2012

У меня есть NSMutableArray, в котором я храню два объекта, но они заменяются на ноль в массиве через некоторое время.Почему это происходит?Объект массива все еще присутствует и показывает, что он содержит два объекта, но оба они равны nil.

Не означает ли тот факт, что они находятся в массиве, означают, что на них есть ссылки, и их не следует удалять?

Странно то, что объекты, которые я поместил в массив, не удаляются, так как на них ссылаются другие объекты, они просто заменяются на ноль в массиве.

-(void)addRender:(id)theRender
{
    if (renderArray == nil)
        renderArray = [NSMutableArray array];

    // Leaving this function and for a while afterwords, the object is in the array.
    // By afterwords, I think is until the autorelease pool is drained, but I can't
    // be sure but the objects are there as I am stepping though code.

    [renderArray addObject:theRender];
}

-(void)render
{
    // By the time this is called, renderArray has 2 nil objects in it.

    if (renderArray)
        [renderArray makeObjectsPerformSelector:@selector(render)];
}

-(void)addRenderфункция вызывается из функции init объектов.Я не знаю, имеет ли это значение, но самообладание уже установлено.

Сами объекты не удаляются, просто заменяются на ноль в массиве.Какое условие заставляет ARC сделать это?Я читал об обнулении слабых ссылок, что-то вроде этого, но я не объявляю что-либо слабой ссылкой, кроме того, объекты все еще вокруг и ссылочные места.

Я провел последние двачасы бьют мою голову от этого.

1 Ответ

0 голосов
/ 02 января 2012

renderArray - объект с автоматическим выпуском, и если вы определяете его только как NSMutableArray *renderArray;, он освобождается до того, как вы получите возможность использовать его в своем методе render.

Попробуйте определить его как __strong NSMutableArray *renderArray;, который скажет ARC оставить его для вас.

...