Получение ошибки с неявным преобразованием указателя с помощью функции автоматического подсчета ссылок - PullRequest
1 голос
/ 15 декабря 2011

Я получаю сообщение об ошибке. Неявное преобразование указателя Objective C в 'void' запрещено с помощью ARC

-(void)openAnimation {

     NSValue *contextPoint =[NSValue valueWithCGPoint:self.view.center];

    [UIView beginAnimation:nil context:contextPoint]; // getting error here
}

Может кто-нибудь помочь мне решить эту ошибку

Спасибо

1 Ответ

4 голосов
/ 15 декабря 2011

Итак, во-первых, я хотел бы отметить, что этот тип вещей проще сделать с помощью методов анимации на основе блоков. Для iOS4 и iOS5 Apple рекомендует использовать эти новые методы вместо .

Но чтобы ответить на ваш конкретный вопрос, параметр context является пустым *. ARC не поддерживает (не может поддерживать) управление указателями void *, поэтому, когда вы передаете свой contextPoint (который является NSValue *) этому методу, ARC фактически теряет его.

Компилятор разрешит это с помощью броска моста. Но вы также должны убедиться, что ваша «contextPoint» доживет до этого метода, поэтому вам нужен конкретный каст __bridge_retained, то есть каст с +1 чистым счетом удержания:

[UIView beginAnimation:nil context:(__bridge_retained void *)contextPoint];

Это решает непосредственную проблему, ожидайте, что теперь вы будете пропускать эту contextPoint. Таким образом, в ваших animationDidStart:context: или animationDidStop:finished:context: (где бы вы ни собирались использовать эту contextPoint) вам нужно сбалансировать этот счет +1 с чем-то вроде этого:

NSValue *contextPoint = (__bridge_transfer NSValue *)context;

Это соединяет этот объект обратно с контролем ARC, и __bridge_transfer говорит ARC освободить этот объект, чтобы сбалансировать __bridge_retained от ранее.

Опять же, вместо этого используйте методы на основе блоков, и пусть ARC и блоки позаботятся об этом за вас. Они уже знают, как правильно захватывать и сохранять нужные вам объекты в ваших блоках анимации или завершения.

Надеюсь, это имеет смысл.

...