removeObjectAtIndex вызывает «сообщение, отправленное на освобожденный экземпляр» - PullRequest
6 голосов
/ 27 октября 2011

Я конвертирую некоторый код в ARC.Код ищет элемент в NSMutableArray, затем находит, удаляет и возвращает этот элемент.Проблема заключается в том, что элемент освобождается сразу после удаления «removeObjectAtIndex»:

- (UIView *)viewWithTag:(int)tag
{
    UIView *view = nil;
    for (int i = 0; i < [self count]; i++)
    {
        UIView *aView = [self objectAtIndex:i];
        if (aView.tag == tag) 
        {
            view = aView;
            NSLog(@"%@",view); // 1 (view is good)
            [self removeObjectAtIndex:i];
            break;
        }
    }
    NSLog(@"%@",view); // 2 (view has been deallocated)
    return view;
}

Когда я его запускаю, я получаю

*** -[UIView respondsToSelector:]: message sent to deallocated instance 0x87882f0

во втором операторе журнала.* Pre-ARC, я был осторожен, чтобы сохранить объект перед вызовом removeObjectAtIndex:, а затем автоматически высвободить его.Как мне сказать ARC сделать то же самое?

1 Ответ

5 голосов
/ 27 октября 2011

Объявите ссылку UIView *view с квалификатором __autoreleasing, например:

- (UIView *)viewWithTag:(int)tag
{
    __autoreleasing UIView *view;
    __unsafe_unretained UIView *aView;

    for (int i = 0; i < [self count]; i++)
    {
        aView = [self objectAtIndex:i];
        if (aView.tag == tag) 
        {
            view = aView;
            //Since you declared "view" as __autoreleasing,
            //the pre-ARC equivalent would be:
            //view = [[aView retain] autorelease];

            [self removeObjectAtIndex:i];
            break;
        }
    }

    return view;
}

__autoreleasing даст вам точно то, что вы хотите, потому что при назначении новый pointee сохраняется, автоматически освобождается и затем сохраняется в lvalue.

См. Ссылка ARC

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