Xcode 10 Object Library

Petit moment de frustration lors de l’édition d’un Storyboard dans XCode 10. La bibliothèque d’objets, habituellement située dans la colonne de droite sous les propriétés a disparu.

Elle est désormais accessible avec la bibliothèque des médias par ce bouton situé dans la barre de titre à droite.

Elle fonctionne comme un panneau temporaire qui disparait après utilisation. Si vous voulez qu’elle reste en permanence sur l’écran, appuyez sur option (⌥) en cliquant sur le bouton.

Les raccourcis pour accéder aux différentes bibliothèques

  • ⌘⇧L ouvre la bibliothèque d’objets temporaire.
  • ⌥⌘⇧L ouvre la bibliothèque d’objets permanente.
  • ⌘⇧M ouvre la bibliothèque de médias temporaire.
  • ⌥⌘⇧M ouvre la bibliothèque de médias permanente.

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()
...

Manipuler le JSON facilement en swift avec SwiftyJSON

Même si Swift fournit des moyens de gérer le JSON avec JSONSerialization, on se retrouve rapidement avec un empilement de valeurs optionnelles et du code assez peu lisible.

SwiftyJSON apporte une solution élégante et simplifie votre code. Par exemple :

if let statusesArray = try? JSONSerialization.jsonObject(with: data, options: .allowFragments)
  as? [[String: Any]],
  let user = statusesArray[0]["user"] as? [String: Any],
  let username = user["name"] as? String {
// Finally we got the username
}

devient :

let json = JSON(data: dataFromNetworking)
if let userName = json[0]["user"]["name"].string {
  //Now you got your value
}

SwiftyJSON peut être ajouté à un projet XCode via Carthage ou CocoaPods. Il est disponible sur github sous license MIT.

https://github.com/SwiftyJSON/SwiftyJSON

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

 

 

Méfiez vous de U+2028 !

Le caractère unicode U+2028 porte aussi le nom de LINE SEPARATOR. C’est un caractère invisible qui selon l’âge de votre éditeur de texte affichera un retour à la ligne sans changement de paragraphe, ou sera simplement ignoré. Sa présence dans un objet JSON sur une de mes applications web a bloqué un ancien interpréteur, alors que le même objet était reconnu valide sur le site jsonlint.

Curieusement, il est aussi autorisé, quoique fortement déconseillé dans les noms de domaines. Il fait d’ailleurs partie de la liste des caractères interdits par certains navigateurs dans les url à cause des problèmes de sécurité qu’ils posent. En effet, cette liste permettrait de créer des noms de domaines ressemblant à des noms existant déjà, et à diriger les internautes vers de faux sites pour leur prendre leurs données confidentielles.

Pour plus d’information, voyez la page de wikipedia sur les attaques homographiques (en)