Когда я использую ARC в проекте IOS, как я могу использовать void *?

Посмотрите этот метод: beginAnimations:context: Это метод класса UIView. Параметр контекста нуждается в типе void-указателя, и мне нужно отправить UIImageView в контекст. Я получаю предупреждение, в котором говорится, что void* запрещен при использовании ARC. Итак, как я могу отправить UIImageView в контекст, кроме как не использовать ARC.

1 ответ

Решение

Комментарии выше предоставили правильный ответ для этого конкретного случая (используйте блочные методы анимации), но в целом, если у вас есть API, который принимает контекст void * и вы хотите передать объект, я считаю, что лучше всего конвертировать ваши id к CFTypeRef так что вы можете получить семантику ручного управления памятью по указателю (CFTypeRef является typedef для void *) и т. д. Обратите внимание, что для этого необходимо, чтобы для возврата вашего объекта был вызван обратный вызов (т. е. преобразован обратно во встроенное управление ARC).

Вот пример для некоторого воображаемого API, который я только что придумал:

- (void) doSomethingWithObject: (id) object {
    // use CFBridgingRetain() to turn object into a manually-retained CFTypeRef/void*
    [someObject performBackgroundTaskWithTarget: self
                                       selector: @selector(bgTask:)
                                        context: CFBridgingRetain(object)];
}

- (void) bgTask: (void *) context
{
    // use CFBridgingRelease() to turn our void*/CFTypeRef into an ARC-managed id
    id object = CFBridgingRelease((CFTypeRef)context);
    ...
}
Другие вопросы по тегам