2012-07-07 1 views
1

LIRE Cette méthode: beginAnimations: context: Ceci est une méthode de classe UIView. Le contexte nécessite un paramètre qui est un type de void-pointeur, et j'ai besoin d'envoyer un UIImageView au contexte. Je reçois un avertissement qui dit que void * a été interdit lorsque j'utilise ARC. Alors, comment puis-je envoyer UIImageView au contexte, sauf utiliser ARC.Quand j'utilise le projet ARC dans IOS, comment puis-je utiliser void *?

+2

Utilisez les méthodes d'animation de bloc de UIView. C'est plus pratique car vous n'avez pas de délégué d'achèvement d'animation ailleurs. –

+0

Plus les docs disent d'utiliser les méthodes d'animation de bloc. –

+0

Merci pour votre aide. Je vais apprendre à utiliser les méthodes d'animation par blocs de UIView. –

Répondre

0

Les commentaires ci-dessus ont fourni la bonne réponse pour ce cas particulier (utiliser les méthodes d'animation par bloc) mais en général si vous avez une API qui prend un contexte void * et que vous souhaitez passer un objet, je le trouve mieux pour convertir votre id en un CFTypeRef afin que vous puissiez obtenir une sémantique de gestion de la mémoire manuelle sur le pointeur (CFTypeRef est un typedef pour void *), etc. Notez cependant que cela nécessite que le rappel doive être appelé pour que votre objet soit libéré (c'est-à-dire reconverti dans la gestion intégrée de l'ARC).

Voici un exemple pour une API imaginaire que je viens Imaginée:

- (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); 
    ... 
} 
Questions connexes