Когда я использую 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);
...
}