ARC fonctionne-t-il avec les objects Core Graphics?

J'ai récemment commencé un nouveau projet en utilisant le comptage automatique de reference (ARC).
Lorsque j'ai atsortingbué le contenu d'un CALayer:

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

J'ai une erreur

La conversion implicite d'un type de pointeur non-Objective-C 'CGImageRef' en 'id' est interdite avec ARC

Il suffit de lancer CGImageRef à id cache l'erreur, mais je me demandais si l'ARC fonctionne encore correctement alors?

Vous devriez vraiment regarder les videos ARC de WWDC 2011. Elles sont disponibles sur le site des développeurs et ouvertes via iTunes. Notamment:

• Session 323 – Introduction au comptage automatique des references

• Session 322 – Les progrès d'Objective-C en profondeur

De plus, les notes de reference ARC:

https://developer.apple.com/library/content/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

Les notes de reference et les videos traitent de Core Graphics (et al) et de leur fonctionnement avec ARC.

Plus précisément, regardez la section intitulée «Gestion du pont sans frais»

Dans de nombreuses applications Cocoa, vous devez utiliser des objects de type Core Foundation, que ce soit du framework Core Foundation lui-même (CFArrayRef ou CFMutableDictionaryRef) ou des frameworks qui adoptent des conventions Core Foundation telles que Core Graphics (vous pouvez utiliser CGColorSpaceRef et CGGradientRef ).

Le compilateur ne gère pas automatiquement les durées de vie des objects Core Foundation. Vous devez appeler CFRetain et CFRelease (ou les variantes spécifiques au type correspondantes) conformément aux règles de memory management de Core Foundation (voir Guide de programmation de la memory management pour Core Foundation).

Si vous effectuez une conversion entre des objects de style Objective-C et Core Foundation, vous devez indiquer au compilateur la sémantique de propriété de l'object à l'aide d'une conversion (définie dans objc / runtime.h) ou d'une macro Core Foundation (définie dans NSObject.h): […]

Jörg Jacobsen a également un bon aperçu des options de transition: Gestion du pont sans frais dans un environnement ARC'ed .

__bridge_retained (nb: utilisez-le uniquement lors de la conversion du pointeur d'object en pointeur C): I (le programmeur) doit referencer cet object pendant un certain time dans le monde sombre des pointeurs de type C qui vous est opaque, ARC. Alors s'il vous plaît, s'il vous plaît ne pas libérer cet object pendant que j'en ai encore besoin. Je (le programmeur) promets de le libérer moi-même (dans le monde des ténèbres) quand j'en aurai fini

__bridge_transfer (nb: ne l'utilise que lors de la conversion du pointeur type C en pointeur object): I (le programmeur) vous remet, ARC, un object que je possède et que je ne suis plus intéressé par le monde sombre de type C des pointeurs qui vous sont opaques. Chaque fois que vous, ARC, avez fini avec cet object, libérez-le vous-même, parce que vous connaissez le bon moment et que vous me sauvez ainsi du travail sans avoir à le faire moi-même.

__bridge : ARC, vous continuez d'équilibrer vos retenues et libérations pendant que je continue d'équilibrer le mien dans le monde sombre des pointeurs de type C qui est …. Chaque fois que je dois me tenir à un object dans le monde obscur, je vais le garder moi-même et le relâcher quand c'est approprié. Je n'ai pas besoin de contrat supplémentaire avec vous, ARC.

Malgré les references soulignées par Steve, je crois que le cas que vous montrez ci-dessus pourrait être spécial. À partir des notes de mise à jour sur la transition à l'ARC , faites attention à la section «Le compilateur traite les objects CF returnnés par les methods du cacao»:

Le compilateur comprend les methods Objective-C qui returnnent les types de base de Core suivant les conventions d'appellation Cocoa historiques (voir Guide avancé de programmation de memory management). Par exemple, le compilateur sait que, dans iOS, le CGColor renvoyé par la méthode CGColor 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 return connu de CGColors à partir de ces methods (il manque le cast à 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 correctement ponté ici. Je pense que votre dissortingbution à id devrait être tout ce dont vous avez besoin ici.

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

Je fais =(__bridge id)image.CGImage .