Итерация по объектам NSMutableArray. Лучшая практика - PullRequest
3 голосов
/ 26 января 2012

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

for (a=0;a<[items count];a++)
{
iItem *item = [[items objectAtIndex:a] autorelease];

    [page.view addSubview:item];

NSLog(@"Item Added: %d\nItem Frame X:%f Y:%f W:%f H:%f",item.itemId,item.frame.origin.x,item.frame.origin.y,item.frame.size.width,item.frame.size.height);

    [item setDelegate:page];

    if ([[items objectAtIndex:a] zOrder] == 1)
        [page.view sendSubviewToBack:item];
    else 
        [page.view bringSubviewToFront:item];

//[item release];
//item = nil;

}

У меня вопрос: если я создал объекты iItem в другом методе с использованием alloc / init и release после добавления его в MutableArray, необходимо ли использовать выпуск поверх iItem, созданного в цикле, после использования?

Спасибо.

Ответы [ 2 ]

14 голосов
/ 26 января 2012

Как уже указывалось omz , вы чрезмерно выпускаете свои товары.Если в вашем массиве есть только элементы типа iItem, вы можете использовать быстрое перечисление :

for (iItem *item in items)
{
    [page.view addSubview:item];

    NSLog(@"Item Added: %d\nItem Frame X:%f Y:%f W:%f H:%f",item.itemId,item.frame.origin.x,item.frame.origin.y,item.frame.size.width,item.frame.size.height);

    [item setDelegate:page];

    if ([item zOrder] == 1)
        [page.view sendSubviewToBack:item];
    else 
        [page.view bringSubviewToFront:item];
}
4 голосов
/ 26 января 2012

Нет.Элемент, к которому вы получаете доступ через objectAtIndex:, не создан , вы просто получаете ссылку на него, который, согласно соглашению, уже автоматически выпущен.Поэтому, если вы добавляете собственный вызов autorelease, вы фактически переоцениваете его, что может привести к зависанию указателя, что может привести к сбою приложения.

...