Tutoriel, Gestion Mémoire en ARC (Automatic Reference Counting) : exemple dans le cas de la résolution d’un bug particulièrement coriace.

Niveau technique : très avancé

Les concepts détaillés dans l’article sont donnés pour macOS, et s’appliquent tels quels à iOS, éventuellement à Java (ramasse miette).

Read More

À Propos des « Protocoles » iOS

Lors d’un entretien récent il m’a été posé la question suivante :
« qu’est-ce qu’un Protocole ? »

La question m’a un peu désemparé puisqu’il s’agit d’un des tout premiers concepts que l’on apprend en Cocoa (vous sauriez expliquer par exemple ce qu’est un PPCM ? (1))

Je donne donc une réponse improvisée, en l’occurrence approximative, et on me répond que
« c’est un contrat, c’est à dire un ensemble de fonctions que vous vous engagez à implémenter »

C’est une bonne définition, néanmoins la réalité est un peu plus subtile.

Read More

Exemple de comportement différent de code iOS selon qu’il s’exécute sur émulateur ou device

- Exemple de comportement différent de code iOS selon qu’il s’exécute sur l’émulateur ou un device (la machine, i.e. iPhone/iPad) :

Soit le code iOS suivant (qui permet de consulter un tableau comme s’il était bouclé sur lui même) :
NSUInteger p0_prevIndex;
 p0_prevIndex = p0Index – diffAtP0;
if(p0Index < diffAtP0)
  p0_prevIndex += iPoints.count;

(le test équivaut à (p0_prevIndex < 0), qui évidemment ne pourrait arriver que s’il était de type NSInteger)

Le code fonctionne parfaitement sous émulateur mais conduit à un crash à la ligne suivante (non représentée), à la lecture du tableau (lecture à l’index p0_prevIndex alors que celui-ci vaut iPoints.count)

La lecture des valeurs à la 3° ligne donne

 (lldb) pri p0Index
 (NSUInteger) $3 = 0
 (lldb) pri diffAtP0
 (CGFloat) $2 = 2
 (lldb) pri p0_prevIndex
 (NSUInteger) $5 = 0

->p0_prevIndex devrait valoir (NSUInteger)(-2) (soit 4294967294, peu importe), et donc (iPoints.count-2) juste après.

Affichage d’autres valeurs :

 (lldb) pri p0Index – diffAtP0
 (float) $4 = -2

-> OK

 (lldb) pri p0_prevIndex = p0Index – diffAtP0
 (NSUInteger) $6 = 0

-> pourquoi ? On devrait obtenir la valeur correspondant à -2…

 (lldb) pri p0_prevIndex = -2
 (NSUInteger) $7 = 4294967294

-> OK, l’affectation directe fonctionne.

Le pb vient d’un typecast, car diffAtP0 est de type CGFloat (en fait le type des iPoints).
Le déclarer en NSUInteger apporte la solution.

La vraie remarque est que le crash ne survient sur aucun des émulateurs car le typecast effectué est alors correct.

Read More

myScore et WM_GSRecognizerLib

Catégorie : application iPhone/iPad
Licence : utilisation gratuite en version de base.
Version : 2.5, 20/10/2017.
Résumé : « myScore » est une application d’écriture manuscrite de partitions, s’appuyant sur la librairie WM_GSRecognizer développée pour l’occasion.

Icone myScoreTélécharger sur iTunes

 

Read More

myCamera

Catégorie : application iPhone/iPad
Licence : utilisation gratuite
Version : 1.0, 07/03/2014
Publicités : aucune
Résumé : « myCamera » est une application pour iPhone/iPad vous permettant de piloter une caméra WiFi ou IP.

Icone myCameraTélécharger sur iTunes

Technologies mises en œuvre :
Réseau : cgi (over http), commandes asynchrones et synchrones,
iOS : timers, images, mise à l’échelle et zoom, gestures (click/longPress/pinch), Notifications Center et Observers, UIViewAnimation, préférences.

Read More