Swift: Que faire d’un objet ‘Unmanaged’

Aux débuts d’Objective-C et de Cocoa, les développeurs devaient gérer eux-mêmes les allocations et libérations de mémoires pour leurs objets avec les méthodes alloc, retain, release.

À chaque emplacement de mémoire est associé un compteur de références, chaque appel à alloc ou retain augmente ce compteur, chaque appel à release diminue ce compteur. Lors d’un release, si le compteur passe à zéro, ça signifie qu’aucun objet dans le code ne fait plus référence à cet emplacement. Il doit donc être libéré. Si le compteur est encore supérieur à zéro, release ne fait rien.

Avec l’ARC (Automatic Reference counting), le compilateur se charge de placer lui-même ces mêmes méthodes aux endroits appropriés, évitant ce travail aux développeurs, et garantissant un équilibre parfait entre les retain et les release. Sauf que pas toujours…

Certaines fonctions fournies par les frameworks d’Apple peuvent vous retourner des Unmanaged. Vous devez pour ces objets décider de la stratégie à adopter. C’est notamment le cas lors que vous manipulez des objets issus de Core Graphics (CG…) ou Core Foundation (CF…).

Exemple, dans la classe AVCapturePhoto :

func cgImageRepresentation() -> Unmanaged<CGImage>?

Cette fonction retourne une Unmanaged CGImage.

Pour récupérer l’objet CGImage lui-même, il faut faire appel à l’une des deux fonctions
takeUnretainedValue() qui n’incrémente pas le compteur de référence
takeRetainedValue() qui incrémente le compteur de référence.

Mais laquelle utiliser ?

En règle générale, si le nom de la fonction qui retourne l’objet Unmanaged contient Create ou Copy, vous utiliserez takeRetainedValue(), sinon c’est takeUnretainedValue() qui convient.

Dans cet exemple :

...
let unmanagedCGImage = capturePhoto.cgImageRepresentation()
let cgImage = unmanagedCGImage.takeUnretainedValue()
...

Carthage ou CocoaPods ?

Les deux gestionnaires de frameworks les plus populaires pour le développent iOS sont Carthage et CocoaPods. Quelles sont les spécificités de chaque produit et lequel choisir pour un nouveau projet ?

CocoaPods

  • est un gestionnaire de dépendances centralisé écrit en Ruby. Vous pouvez chercher un framework compatible directement sur cocoapods.org
  • modifie votre projet XCode et modifie les paramètres pour vous. Il simplifie donc l’ajout d’un framework.
  • dépend de la version de XCode que vous utilisez. Si vous metttez à jour XCode, veillez à ce que CocoaPods dispose d’une version compatible.
  • dispose d’une application qui vous permet de l’utiliser sans taper de commandes dans le terminal.

Carthage

  • est un gestionnaire de dépendance décentralisé écrit en Swift. Vous n’avez pas de liste des frameworks compatibles. En général le README du framework vous indique sa compatibilité. Les plus populaires proposent tous une installation via Carthage.
  • ne modifie pas votre projet. Vous devez vous-même mettre à jour la section Linked Frameworks and Libraries de votre projet XCode et ajouter une Build Phase à votre Target.
  • nécessite l’usage du terminal et de lignes de commandes