Question

J'ai récemment commencé un nouveau projet à l'aide de comptage automatique de référence (ARC).
Quand j'affecté le contenu d'un CALayer:

UIView* view = ...
UIImage* image = ...
view.layer.contents = image.CGImage

Je suis une erreur

conversion implicite d'un type de pointeur-C non-objectif 'CGImageRef' à 'id' est rejetée avec ARC

Castings simplement le CGImageRef à id cache l'erreur, mais je me demandais si l'ARC toujours fonctionne correctement alors?

Était-ce utile?

La solution

Vous devriez vraiment vérifier les vidéos ARC de la WWDC 2011. Ils sont disponibles sur le site développeur et ouvert via iTunes. En particulier:

• Session 323 - Présentation de comptage automatique de référence

• Session 322 - Objective-C en profondeur Avancements

En outre, les notes de référence ARC:

https://developer.apple .com / bibliothèque / content / releasenotes / ObjectiveC / RN-TransitioningToARC / introduction / introduction.html

Les deux notes de référence et les vidéos de discuter Core Graphics (et al) et comment ils fonctionnent avec l'ARC.

Plus précisément, regardez la section intitulée "Gestion sans frais Bridging"

Dans de nombreuses applications Cocoa, vous avez besoin d'utiliser des objets de style Core Foundation, que ce soit du cadre de base Fondation elle-même (par exemple, CFArrayRef ou CFMutableDictionaryRef) ou des cadres qui adoptent conventions fondamentales de la Fondation tels que Core Graphics (vous pouvez utiliser les types comme CGColorSpaceRef et CGGradientRef).

Le compilateur ne gère pas automatiquement la durée de vie de base objets Fondation; vous devez appeler CFRetain et CFRelease (ou variantes de type spécifique correspondant) comme dicté par le noyau Fondation des règles de gestion de la mémoire (voir Programmation Gestion de la mémoire Guide pour la Fondation de base).

Si vous lancez entre les objets Objective-C et Core style Fondation, vous besoin de dire au compilateur la sémantique de propriété de l'objet en utilisant soit un plâtre (défini dans objc / runtime.h) ou un noyau macro style Fondation (défini dans NSObject.h): [...]

Jörg Jacobsen a un bon aperçu sommaire des options de transition ainsi: Gestion de Bridging sans frais dans un environnement ARC'ed.

__ bridge_retained (N.B. .: ne l'utiliser que lors de la coulée du pointeur d'objet pointeur de type C): I (le programmeur) pour référencer cet objet pendant un certain temps dans le monde sombre de pointeurs de type C qui est opaque à vous, ARC. Alors s'il vous plaît, s'il vous plaît ne pas relâcher cet objet pendant que je reste besoin de ça. I (le programmeur) promet de libérer moi-même (dans l'obscurité monde) quand je suis fait avec elle

__ bridge_transfer (N.B. .: ne l'utiliser lors de la coulée du pointeur de type C à pointeur d'objet): I (le programmeur) la main à vous, ARC, un objet que je possède et que je ne suis plus intéressé à dans l'obscurité monde des pointeurs de type C qui est opaque pour vous. Chaque fois que vous, ARC, êtes fait avec cet objet s'il vous plaît libérer vous-même, parce que vous connaissez le bon moment et donc me sauver un peu de travail ne pas avoir à le faire moi-même.

__ pont : ARC, vous continuez à équilibrer votre conserve et libère que je continue à équilibrer le mien dans le monde sombre de pointeurs de type C qui est…. Chaque fois que je dois tenir sur un objet dans le monde sombre je vais conservez-le moi et le libérer, le cas échéant. Je ne ai pas besoin contrat supplémentaire avec vous, ARC.

Autres conseils

Malgré les références indiquées par Steve, je crois le cas, vous montrer ci-dessus pourrait être spécial. De Evoluer vers le ARC Notes de version , attention à la section « le compilateur gère CF objets retournés à partir de méthodes de cacao »:

Le compilateur comprend des méthodes Objective-C qui reviennent de base types Fondation suivent les conventions historiques nommant Cocoa (voir Guide de programmation de gestion avancée de la mémoire). Par exemple, la compilateur sait que, dans iOS, le CGColor retourné par le CGColor méthode de UIColor n'appartient pas.

L'exemple de code qu'ils fournissent:

gradientLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor darkGrayColor] CGColor],
                                                 (id)[[UIColor lightGrayColor] CGColor], nil];

repose sur le rendement connu de CGColors de ces méthodes (ils manquent le casting pour id que j'ai ajouté dans le code ci-dessus, ce qui devrait être corrigé dans leur documentation bientôt).

Parce que [image CGImage] suit les conventions de nommage, je crois que le CGImage sera comblé correctement ici. Je pense que votre casting à id devrait être tout ce que vous avez besoin.

Une réponse populaire à la question de layer.contents = (id)image.CGImage est layer.contents = obj_unretainedObject(image.CGImage).

Je fais =(__bridge id)image.CGImage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top