Slides de la présentation "Bien coder sur iOS" de la session des CocoaHeads Rennais du 08 septembre 2011. Présentation assurée par Julien Quéré, co-organisateur.
1. Bien coder
Sur iOS
CocoaHeads Rennes Julien QUERE
8 septembre 2011 julien@cocoaheads.fr
2. Pour qui ? Pourquoi ?
Pour l’utilisateur Pour le futur
✓ Performance
✓ Compréhensibilité
✓ Stabilité
✓ Flexibilité
‣ Moins de bugs
✓ Réutilisabilité
‣ Moins de retours
‣ Maintenance et évolutions plus
aisés
‣ Une meilleure expérience
utilisateur/client
‣ Projets plus rapides
➡ Gain de temps
➡Gain de temps
➡ Gain en crédibilité
➡Gain en réactivité
6. Formatage
➡ Un code propre = code compréhensible
➡ Surveiller: l’indentation, le placement des délimiteurs, ...
7. Nommage
Il faut pouvoir facilement différencier:
➡ Une variable statique
➡ Une variable d’instance
➡ Un attribut
➡ Une variable de classe
➡ Une variable locale
8. La règle de 3
➡ Je développe une routine une fois
➡ Seconde fois: je me pose des questions
➡ Troisième fois: je factorise
11. Utiliser des constantes
➡ Pas de valeur numérique / textuelle «en dur»
➡ Utiliser des constantes
➡ Utiliser un fichier de locales
12. Définir ses propres guidelines
➡ Prendre le temps et du recul
➡ Intégrer toute l’équipe dans le processus
➡ Ne pas hésiter à se baser sur des guidelines existantes
Google Objective-C Style Guide
http://google-styleguide.googlecode.com/svn/trunk/objcguide.xml
13. Gestion intelligente des
ressources
« Quand on est pauvre, on n'a que la
ressource d'être sage. »
Jean-Pierre Florian
15. Batterie
Pour gagner en autonomie, iOS désactive le materiel dés que
possible:
➡ CPU
➡ Radio (Wi-Fi, Bluetooth, GPS, EDGE/3G)
➡ Accéléromètre / gyroscope
C’est en réduisant l’usage
➡ Boussole
de ces matériels que l’on
➡ Disque (stockage flash) augmente l’autonomie
➡ Ecran
16. Batterie: L’exemple Core
Location
➡ Solution simple:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)
launchOptions {
! manager_ = [[CLLocationManager alloc] init];
! manager_.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
! manager_.delegate = self;
! [manager_ startUpdatingLocation];
➡ Core Location va mettre à jour la position en continu ...
➡ ... jusqu'à ce que la batterie soit vide
17. Batterie: L’exemple Core
Location
➡ Solution économique:
➡ Ne lancer Core Location que quand c’est nécessaire
➡ Régler la précision avec intelligence
➡ Ne pas laisser tourner Core Location inutilement
18. Batterie - Mais aussi
➡ Eviter tout calcul inutile
➡ Ne jamais utiliser [application setIdleTimerDisabled:YES] sans raison
➡ Eviter les accès trop fréquents au disque
➡ Ne dessiner que ce qui est nécessaire
➡ Utiliser l'accéléromètre / gyroscope avec autant de parcimonie que
Core Location
➡ Limiter les accès réseau
19. Réseau
➡ Choisissez bien votre format ! 19 Ko
18,05 Ko
➡ Exemple avec recherche twitter 14 Ko
Le JSON est 52% moins 10 Ko
9,47 Ko
lourd que le XML
5 Ko
Données calculées sur la moyenne de 100 0 Ko
appels à l’API Twitter en JSON vs XML Taille de la réponse
http://search.twitter.com/search.json?
XML JSON
q=cocoaheads&result_type=mixed&count=100
20. Réseau
➡ Ne prendre ce qui est nécessaire
➡ Pourquoi télécharger 100 tweets sur les CocoaHeads alors
qu’on en affichera que 15 ?
➡ Astuce: utiliser la pagination
➡ Mais ne pas en abuser: éviter de trop nombreuses petites
requêtes
21. Réseau
➡ Malheureusement, on n’a pas toujours la main sur la
plateforme Web
➡ Il faut s’en accommoder
➡ Commencer la réflexion en partant du mobile dès que
possible
22. La mémoire
« La mémoire, c'est comme une valise. On
met toujours dedans des choses qui ne
servent à rien.»
Walter Prévost
23. La mémoire
➡ Objectif: réduire son emprunte mémoire:
➡ Consommer le moins de mémoire, le moins longtemps
possible.
24. La mémoire
Plus les appareils montent en
gamme plus il y a de mémoire.
128 Mo
Cependant, iOS est de plus en plus
58 Mo
96 Mo
gourmand avec le temps
4 Mo
64 Mo 10 Mo Disponible
12 Mo Téléphone
Springboard
32 Mo 32 Mo Démons
Kernel
12 Mo Couche graphique
0 Mo
Source: Apple TechTalks Paris 2009
Valeurs pour un iPhone 3G
25. La mémoire
➡ Principales sources de « gaspillage »:
➡ Les fuites
➡ La mémoire allouée inutilement
➡ La mémoire libérée trop tard
27. Gare à l’autoRelease !
➡ Tout objet en autorelease est placé dans le bassin le plus
«proche»
➡ Quand le bassin est vidé, il envoie un Release à chacun
des objets qu’il gère
L’autorelease très pratique, mais il
faut redoubler de vigilance
28. Gare à l’autoRelease !
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
TBXML * tbxml = [[TBXML alloc] initWithXMLData:xmlData];
TBXMLElement *root = tbxml.rootXMLElement;
if (root) {
TBXMLElement *item = [TBXML childElementNamed:@"item" parentElement:root];
while (item != nil) {
// Parsing code
item = [TBXML nextSiblingNamed:@"item" searchFromElement:item];
}
}
[tbxml release];
[pool release];
50MB 49MB
38MB 35MB
25MB
20MB
13MB
5MB 5MB 5MB 5MB
0MB
Parsing d’un fichier XML basé sur le Top 300 iTunes avec TBXML 1.4.
Mesures effectuées avec instruments.
29. Gare à l’autoRelease !
TBXML * tbxml = [[TBXML alloc] initWithXMLData:xmlData];
TBXMLElement *root = tbxml.rootXMLElement;
if (root) {
TBXMLElement *item = [TBXML childElementNamed:@"item" parentElement:root];
while (item != nil) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// Parsing code
[pool release];
item = [TBXML nextSiblingNamed:@"item" searchFromElement:item];
}
}
[tbxml release];
Une gestion fine de l’autorelease,
c’est une gestion fine de la mémoire
50MB 49MB
38MB 35MB
25MB
20MB
13MB 12MB 12MB
5MB 7MB 5MB 5MB 5MB
0MB
Parsing d’un fichier XML basé sur le Top 300 iTunes avec TBXML 1.4.
Mesures effectuées avec instruments.
30. Le Dealloc
➡ Un dealloc vide ou incomplet: c’est la garantie de fuites
mémoire.
➡ Astuce 1: A la création d’une variable d’instance, on la met de
suite dans le dealloc (si il y a lieu).
➡ Astuce 2: Mettre les variable dans le même ordre dans
l’interface que dans le dealloc.
➡ Ne jamais oublier le [super dealloc];
33. Memory warning
➡ Le memory warning signifie que le système va être à court de
mémoire.
➡ Soyez courtois, et libérez tout ce que vous pouvez.
➡ Rappelez vous, le système a la License To Kill.
34. Memory warning
Trois options pour être tenu au courant:
➡ Dans un ViewController: - (void) didReceiveMemoryWarning;
➡ Dans l’UIApplicationDelegte:
- (void) applicationDidReceiveMemoryWarning:(UIApplication *)application;
➡ Partout ailleurs: UIApplicationDidReceiveMemoryWarningNotification
35. Crash et ralentissement
« Développement : Alliance d'une science
inexacte et d'une activité humaine faillible.»
Luc Fayard
37. Core Data
➡ Un NSManagedObjectContext ne peux être partagé entre
plusieurs threads
➡ Un NSManagedObject n’est valide que dans son
NSManagedObjectContext
➡ Conséquence: il ne faut pas passer de NSManagedObject
entre plusieurs threads !
38. Core Data
1 2
ObjectID ObjectID
3 3
Thread 1 / MOC 1 Thread 2 / MOC 2
NSString * monObjectId = [monObjet objectID];
[monContext objectWithID:monObjectId];
39. Mais aussi ...
➡ Être très rigoureux sur la gestion des retain / release
➡ User et abuser du respondsToSelector:
➡ Toujours penser aux cas aux limites
➡ Instruments offre des outils pour tracer et comprendre tout
ça ...
40. Analyser
« L'ouvrier qui veut bien faire son travail doit
commencer par aiguiser ses instruments. »
Confucius
41. Analyser
Ce que je voulais Ce que je pense Ce que j’ai
faire avoir fait fait
42. Analyser
➡ Analyser, c’est comprendre ce qui a été réellement fait
➡ Instruments est l’outil parfait pour ça:
Consommation Fuites Consommation
mémoire mémoire d’énergie
Performances graphiques Zombies
44. Conclusions
➡ Bien coder, c’est du temps, de la crédibilité et de l’argent de
gagné.
➡ Définir des règles intelligemment ... et s’y tenir !
➡ Soyez courtois avec les ressources
➡ Lisez, creusez et comprenez la documentation ...
45. julien@cocoaheads.fr
CocoaHeads #3 thomas.dupont@cocoaheads.fr
Bien débuter sur iOS
Mail : jeremy.brault@niji.fr
Web : www.niji.fr
Bien coder sur iOS
Mail : julien@cocoaheads.fr
Web : www.cocoaheads.fr
Twitter : @CocoaHeadsRNS