SlideShare una empresa de Scribd logo
1 de 45
Descargar para leer sin conexión
Bien coder
                       Sur iOS




CocoaHeads Rennes                     Julien QUERE
 8 septembre 2011                julien@cocoaheads.fr
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é
Coding guidelines

« L’important, ce n’est pas les règles, c’est le
               fait d’en avoir »



                                                   J.
Formatage
- (NSURL*) url {
! NSString * url = [NSString stringWithString:kWDGdirectionsBaseURL];
! NSDictionary *      parameters = [self parameters];
!
! if(parameters)
! {
! BOOL isFirstKey = YES;
! !    ! ! NSString * separator = @"?";
! !
! !    ! for (NSString * key in [parameters allKeys]) {
! !    ! url = [url stringByAppendingFormat:@"%@%@=%@", separator, key, [parameters
valueForKey:key]];
! !    !
! !    ! if(isFirstKey)
! !    {
! !    ! isFirstKey = NO;
! !    ! ! separator = @"&";
! !    ! }
! !    }
! !    }
! !    ! ! ! url = [url stringByAddingPercentEscapesUsingEncoding:
! !       NSUTF8StringEncoding];
! return [NSURL URLWithString:url];
}
Formatage
-   (NSURL*) url {
!    NSString * url = [NSString stringWithString:kWDGdirectionsBaseURL];
!    NSDictionary * parameters = [self parameters];
!
!   if(parameters) {
!   !   BOOL isFirstKey = YES;
!   !   NSString * separator = @"?";
!   !
!   !   for (NSString * key in [parameters allKeys]) {
!   !   ! url = [url stringByAppendingFormat:@"%@%@=%@", separator, key, [parameters valueForKey:key]];
!   !   !
!   !   ! if(isFirstKey) {
!   !   ! ! isFirstKey = NO;
!   !   ! ! separator = @"&";
!   !   ! }
!   !   }
!   }
!   url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
!   return [NSURL URLWithString:url];
}
Formatage


➡   Un code propre = code compréhensible

➡   Surveiller: l’indentation, le placement des délimiteurs, ...
Nommage
Il faut pouvoir facilement différencier:

➡   Une variable statique

➡   Une variable d’instance

➡   Un attribut

➡   Une variable de classe

➡   Une variable locale
La règle de 3


➡   Je développe une routine une fois

➡   Seconde fois: je me pose des questions

➡   Troisième fois: je factorise
- (void) displayTopTweets:(NSArray*)tweets {
! if([tweets count] == 4) {
! !    [tweetButton1_.titleLabel setNumberOfLines:2];
! !    [tweetButton1_ setTitle:[tweets objectAtIndex:0]
! !    !   !   !      forState:UIControlStateNormal];
! !    [tweetButton1_ setTitle:[[tweets objectAtIndex:0] uppercaseString]
! !    !   !   !      forState:UIControlStateHighlighted];
! !    [tweetButton1_ setHidden:NO];
!
! !    [tweetButton2_.titleLabel setNumberOfLines:2];
! !    [tweetButton2_ setTitle:[tweets objectAtIndex:1]
! !    !   !   !      forState:UIControlStateNormal];
! !    [tweetButton2_ setTitle:[[tweets objectAtIndex:1] uppercaseString]
! !    !   !   !      forState:UIControlStateHighlighted];
! !    [tweetButton2_ setHidden:NO];
! !
! !    [tweetButton3_.titleLabel setNumberOfLines:2];
! !    [tweetButton3_ setTitle:[tweets objectAtIndex:2]
! !    !   !   !      forState:UIControlStateNormal];
! !    [tweetButton3_ setTitle:[[tweets objectAtIndex:2] uppercaseString]
! !    !   !   !      forState:UIControlStateHighlighted];
! !    [tweetButton3_ setHidden:NO];
! !
! !    [tweetButton4_.titleLabel setNumberOfLines:2];
! !    [tweetButton4_ setTitle:[tweets objectAtIndex:3]
! !    !   !   !      forState:UIControlStateNormal];
! !    [tweetButton4_ setTitle:[[tweets objectAtIndex:3] uppercaseString]
! !    !   !   !      forState:UIControlStateHighlighted];
! !    [tweetButton4_ setHidden:NO];!!
! !}
}
- (void) displayTopTweets:(NSArray*)tweets {
    !       NSArray * buttons = [NSArray arrayWithObjects:tweetButton1_, tweetButton2_,
    !       !    !  !   !   !    tweetButton3_, tweetButton4_, nil];

    !       if([buttons count] == [tweets count]) {
!
    !       !    for (NSUInteger i = 0; i < [buttons count]; i++) {
        !    !    !   UIButton * button = [buttons objectAtIndex:i];
        !    !    !   NSString * tweet = [tweets objectAtIndex:i];
  ! !            !
   ! !            !   [button.titleLabel setNumberOfLines:2];
   ! !            !   [button setTitle:tweet
   ! !            !   !   !  forState:UIControlStateNormal];
   ! !            !   [button setTitle:[tweet uppercaseString]
   ! !            !   !   !  forState:UIControlStateHighlighted];
   ! !            !   [button setHidden:NO];
  ! !            }
!
  ! }
 }




!       !




!       !
Utiliser des constantes

➡ Pas de valeur numérique / textuelle «en dur»
➡ Utiliser des constantes
➡ Utiliser un fichier de locales
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
Gestion intelligente des
       ressources

« Quand on est pauvre, on n'a que la
      ressource d'être sage. »



                                       Jean-Pierre Florian
Quelles ressources ?

Batterie   Echanges   Mémoire
            réseau
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
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
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
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
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
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
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
La mémoire

« La mémoire, c'est comme une valise. On
  met toujours dedans des choses qui ne
             servent à rien.»


                                       Walter Prévost
La mémoire


➡ Objectif: réduire son emprunte mémoire:
➡ Consommer le moins de mémoire, le moins longtemps
    possible.
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
La mémoire

➡ Principales sources de « gaspillage »:
➡ Les fuites
➡ La mémoire allouée inutilement
➡ La mémoire libérée trop tard
La mémoire



Rappel: 1 retain / alloc / copy = 1 release
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
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.
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.
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];
Be lazy
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self != nil) {
        credits_ = [[NSString stringWithContentsOfFile:filePath] retain];
    }
    return self;
}
- (IBAction) showCredits:(UIButton*) sender {
! [self displayTextPopup:credits_];
}
- (void) dealloc {
! [credits_ release];
! [super dealloc];
}
Be lazy
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self != nil) {

    }
    return self;
}
- (NSString*)credits {
! if(!credits_) {
        credits_ = [[NSString stringWithContentsOfFile:filePath] retain];
! }!
! return credits_;
}
- (IBAction) showCredits:(UIButton*) sender {
! [self displayTextPopup:[self credits]];
!     !
}
- (void) dealloc {
! [credits_ release];
! [super dealloc];
}
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.
Memory warning
    Trois options pour être tenu au courant:

➡   Dans un ViewController: -            (void) didReceiveMemoryWarning;



➡   Dans l’UIApplicationDelegte:

    - (void) applicationDidReceiveMemoryWarning:(UIApplication *)application;



➡   Partout ailleurs: UIApplicationDidReceiveMemoryWarningNotification
Crash et ralentissement

  « Développement : Alliance d'une science
inexacte et d'une activité humaine faillible.»



                                             Luc Fayard
Crash et ralentissement
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 !
Core Data
                                                      1              2


  ObjectID                                                ObjectID


     3                                                       3


Thread 1 / MOC 1                                 Thread 2 / MOC 2


             NSString * monObjectId = [monObjet objectID];
             [monContext objectWithID:monObjectId];
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 ...
Analyser

« L'ouvrier qui veut bien faire son travail doit
 commencer par aiguiser ses instruments. » 



                                               Confucius
Analyser




Ce que je voulais    Ce que je pense   Ce que j’ai
     faire              avoir fait        fait
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
Conclusions


« Je sens que, ce soir, je vais conclure »



                                         Jean-Claude Dusse
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 ...
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

Más contenido relacionado

Destacado

Gas Plant Separator Design
Gas Plant Separator DesignGas Plant Separator Design
Gas Plant Separator Designiyaselex
 
Crude oil Production System
Crude oil Production System Crude oil Production System
Crude oil Production System Tobiloba Omitola
 
Q913 rfp w3 lec 12, Separators and Phase envelope calculations
Q913 rfp w3 lec 12, Separators and Phase envelope calculationsQ913 rfp w3 lec 12, Separators and Phase envelope calculations
Q913 rfp w3 lec 12, Separators and Phase envelope calculationsAFATous
 
Oil & Gas Production and Surface Facilities
Oil & Gas Production and Surface FacilitiesOil & Gas Production and Surface Facilities
Oil & Gas Production and Surface FacilitiesMohamed Elnagar
 
Foro Impulsa Popular 2014 "Tendencia" - Antoni Gutiérrez-Rubí
Foro Impulsa Popular 2014 "Tendencia" - Antoni Gutiérrez-RubíForo Impulsa Popular 2014 "Tendencia" - Antoni Gutiérrez-Rubí
Foro Impulsa Popular 2014 "Tendencia" - Antoni Gutiérrez-RubíBanco Popular
 
Pensando como presidente[1]
Pensando como presidente[1]Pensando como presidente[1]
Pensando como presidente[1]elias2000campos
 
Cours 6 : Tectonique des plaques / présence
Cours 6 : Tectonique des plaques / présenceCours 6 : Tectonique des plaques / présence
Cours 6 : Tectonique des plaques / présenceNicolas Coltice
 
Cours 3 : Le système solaire
Cours 3 : Le système solaireCours 3 : Le système solaire
Cours 3 : Le système solaireNicolas Coltice
 
Engage roadshow - Partie 1 - le social
Engage roadshow - Partie 1 - le socialEngage roadshow - Partie 1 - le social
Engage roadshow - Partie 1 - le socialNa-Young Kwon
 
Diseño+de..
Diseño+de..Diseño+de..
Diseño+de..arjen13
 
Ultima correccion desarrollo monica, angelica y martinRASGOS PSICOLÓGICOS DOM...
Ultima correccion desarrollo monica, angelica y martinRASGOS PSICOLÓGICOS DOM...Ultima correccion desarrollo monica, angelica y martinRASGOS PSICOLÓGICOS DOM...
Ultima correccion desarrollo monica, angelica y martinRASGOS PSICOLÓGICOS DOM...quiztian1101
 

Destacado (20)

Oil and gas separators
Oil and gas separatorsOil and gas separators
Oil and gas separators
 
Gas Plant Separator Design
Gas Plant Separator DesignGas Plant Separator Design
Gas Plant Separator Design
 
Oil and gas separators
Oil and gas separatorsOil and gas separators
Oil and gas separators
 
Separator
SeparatorSeparator
Separator
 
Crude oil Production System
Crude oil Production System Crude oil Production System
Crude oil Production System
 
Q913 rfp w3 lec 12, Separators and Phase envelope calculations
Q913 rfp w3 lec 12, Separators and Phase envelope calculationsQ913 rfp w3 lec 12, Separators and Phase envelope calculations
Q913 rfp w3 lec 12, Separators and Phase envelope calculations
 
Esplendido
EsplendidoEsplendido
Esplendido
 
Oil & Gas Production and Surface Facilities
Oil & Gas Production and Surface FacilitiesOil & Gas Production and Surface Facilities
Oil & Gas Production and Surface Facilities
 
Three Phase Separators
Three Phase SeparatorsThree Phase Separators
Three Phase Separators
 
Foro Impulsa Popular 2014 "Tendencia" - Antoni Gutiérrez-Rubí
Foro Impulsa Popular 2014 "Tendencia" - Antoni Gutiérrez-RubíForo Impulsa Popular 2014 "Tendencia" - Antoni Gutiérrez-Rubí
Foro Impulsa Popular 2014 "Tendencia" - Antoni Gutiérrez-Rubí
 
Pensando como presidente[1]
Pensando como presidente[1]Pensando como presidente[1]
Pensando como presidente[1]
 
Cours 6 : Tectonique des plaques / présence
Cours 6 : Tectonique des plaques / présenceCours 6 : Tectonique des plaques / présence
Cours 6 : Tectonique des plaques / présence
 
Topic 6 project
Topic 6 projectTopic 6 project
Topic 6 project
 
Cours 3 : Le système solaire
Cours 3 : Le système solaireCours 3 : Le système solaire
Cours 3 : Le système solaire
 
Las etas
Las etasLas etas
Las etas
 
Engage roadshow - Partie 1 - le social
Engage roadshow - Partie 1 - le socialEngage roadshow - Partie 1 - le social
Engage roadshow - Partie 1 - le social
 
Lugares de asturias-33677
Lugares de asturias-33677Lugares de asturias-33677
Lugares de asturias-33677
 
Ensayo
EnsayoEnsayo
Ensayo
 
Diseño+de..
Diseño+de..Diseño+de..
Diseño+de..
 
Ultima correccion desarrollo monica, angelica y martinRASGOS PSICOLÓGICOS DOM...
Ultima correccion desarrollo monica, angelica y martinRASGOS PSICOLÓGICOS DOM...Ultima correccion desarrollo monica, angelica y martinRASGOS PSICOLÓGICOS DOM...
Ultima correccion desarrollo monica, angelica y martinRASGOS PSICOLÓGICOS DOM...
 

Similar a Cocoaheads Rennes #3 : Bien coder sur iOS

Tout ce que le getting started mongo db ne vous dira pas
Tout ce que le getting started mongo db ne vous dira pasTout ce que le getting started mongo db ne vous dira pas
Tout ce que le getting started mongo db ne vous dira pasPierre-Alban DEWITTE
 
Tout ce que le getting started MongoDB ne vous dira pas
Tout ce que le getting started MongoDB ne vous dira pasTout ce que le getting started MongoDB ne vous dira pas
Tout ce que le getting started MongoDB ne vous dira pasBruno Bonnin
 
Cappuccino - ou comment créer une application web en 5 minutes
Cappuccino - ou comment créer une application web en 5 minutes Cappuccino - ou comment créer une application web en 5 minutes
Cappuccino - ou comment créer une application web en 5 minutes Geeks Anonymes
 
CocoaHeads Rennes #4 : Tests automatisés sur iOS
CocoaHeads Rennes #4 : Tests automatisés sur iOSCocoaHeads Rennes #4 : Tests automatisés sur iOS
CocoaHeads Rennes #4 : Tests automatisés sur iOSCocoaHeadsRNS
 
"Introduction aux Developements iOS" in Three hours
"Introduction aux Developements iOS" in Three hours"Introduction aux Developements iOS" in Three hours
"Introduction aux Developements iOS" in Three hoursLaurent MEURISSE
 
Démo Gatling au Performance User Group de Casablanca - 25 sept 2014
Démo Gatling au Performance User Group de Casablanca - 25 sept 2014Démo Gatling au Performance User Group de Casablanca - 25 sept 2014
Démo Gatling au Performance User Group de Casablanca - 25 sept 2014Benoît de CHATEAUVIEUX
 
HTML5 maintenant partie 2 : APIs
HTML5 maintenant partie 2 : APIsHTML5 maintenant partie 2 : APIs
HTML5 maintenant partie 2 : APIsJean-Pierre Vincent
 
Architecture et Bonnes pratiques Android #DevoxxFr2016 Part1
Architecture et Bonnes pratiques Android #DevoxxFr2016 Part1Architecture et Bonnes pratiques Android #DevoxxFr2016 Part1
Architecture et Bonnes pratiques Android #DevoxxFr2016 Part1Mathias Seguy
 
10 tips pour améliorer les performances de vos applications Windows 8
10 tips pour améliorer les performances de vos applications Windows 810 tips pour améliorer les performances de vos applications Windows 8
10 tips pour améliorer les performances de vos applications Windows 8Microsoft
 
ALT.Net Juin 2012 - Specflow
ALT.Net Juin 2012 - SpecflowALT.Net Juin 2012 - Specflow
ALT.Net Juin 2012 - SpecflowMathias Kluba
 
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileNouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileIppon
 
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et mobilité
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et mobilitéNouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et mobilité
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et mobilitéJulien Dubois
 
CocoaHeads Rennes #6
CocoaHeads Rennes #6CocoaHeads Rennes #6
CocoaHeads Rennes #6CocoaHeadsRNS
 
20131024 qualité de code et sonar - mug lyon
20131024   qualité de code et sonar - mug lyon20131024   qualité de code et sonar - mug lyon
20131024 qualité de code et sonar - mug lyonClement Bouillier
 
Spring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsSpring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsJulien Wittouck
 
Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !VISEO
 
Internationalisation du Front
Internationalisation du FrontInternationalisation du Front
Internationalisation du FrontYannick Croissant
 

Similar a Cocoaheads Rennes #3 : Bien coder sur iOS (20)

Tout ce que le getting started mongo db ne vous dira pas
Tout ce que le getting started mongo db ne vous dira pasTout ce que le getting started mongo db ne vous dira pas
Tout ce que le getting started mongo db ne vous dira pas
 
Tout ce que le getting started MongoDB ne vous dira pas
Tout ce que le getting started MongoDB ne vous dira pasTout ce que le getting started MongoDB ne vous dira pas
Tout ce que le getting started MongoDB ne vous dira pas
 
Cappuccino - ou comment créer une application web en 5 minutes
Cappuccino - ou comment créer une application web en 5 minutes Cappuccino - ou comment créer une application web en 5 minutes
Cappuccino - ou comment créer une application web en 5 minutes
 
CocoaHeads Rennes #4 : Tests automatisés sur iOS
CocoaHeads Rennes #4 : Tests automatisés sur iOSCocoaHeads Rennes #4 : Tests automatisés sur iOS
CocoaHeads Rennes #4 : Tests automatisés sur iOS
 
"Introduction aux Developements iOS" in Three hours
"Introduction aux Developements iOS" in Three hours"Introduction aux Developements iOS" in Three hours
"Introduction aux Developements iOS" in Three hours
 
Démo Gatling au Performance User Group de Casablanca - 25 sept 2014
Démo Gatling au Performance User Group de Casablanca - 25 sept 2014Démo Gatling au Performance User Group de Casablanca - 25 sept 2014
Démo Gatling au Performance User Group de Casablanca - 25 sept 2014
 
HTML5 maintenant partie 2 : APIs
HTML5 maintenant partie 2 : APIsHTML5 maintenant partie 2 : APIs
HTML5 maintenant partie 2 : APIs
 
Architecture et Bonnes pratiques Android #DevoxxFr2016 Part1
Architecture et Bonnes pratiques Android #DevoxxFr2016 Part1Architecture et Bonnes pratiques Android #DevoxxFr2016 Part1
Architecture et Bonnes pratiques Android #DevoxxFr2016 Part1
 
10 tips pour améliorer les performances de vos applications Windows 8
10 tips pour améliorer les performances de vos applications Windows 810 tips pour améliorer les performances de vos applications Windows 8
10 tips pour améliorer les performances de vos applications Windows 8
 
ALT.Net Juin 2012 - Specflow
ALT.Net Juin 2012 - SpecflowALT.Net Juin 2012 - Specflow
ALT.Net Juin 2012 - Specflow
 
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileNouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
 
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et mobilité
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et mobilitéNouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et mobilité
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et mobilité
 
CocoaHeads Rennes #6
CocoaHeads Rennes #6CocoaHeads Rennes #6
CocoaHeads Rennes #6
 
Html5 now light
Html5 now lightHtml5 now light
Html5 now light
 
20131024 qualité de code et sonar - mug lyon
20131024   qualité de code et sonar - mug lyon20131024   qualité de code et sonar - mug lyon
20131024 qualité de code et sonar - mug lyon
 
Spring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsSpring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'ts
 
Drupal & Mobilité
Drupal & MobilitéDrupal & Mobilité
Drupal & Mobilité
 
Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !
 
Internationalisation du Front
Internationalisation du FrontInternationalisation du Front
Internationalisation du Front
 
FOF Spécial Webinaire.pdf
FOF Spécial Webinaire.pdfFOF Spécial Webinaire.pdf
FOF Spécial Webinaire.pdf
 

Más de CocoaHeadsRNS

CocoaHeads Rennes #16: OHHTTPStubs
CocoaHeads Rennes #16: OHHTTPStubsCocoaHeads Rennes #16: OHHTTPStubs
CocoaHeads Rennes #16: OHHTTPStubsCocoaHeadsRNS
 
CocoaHeads Rennes #14: iOS7 Controllers Transitions
 CocoaHeads Rennes #14: iOS7 Controllers Transitions CocoaHeads Rennes #14: iOS7 Controllers Transitions
CocoaHeads Rennes #14: iOS7 Controllers TransitionsCocoaHeadsRNS
 
CocoaHeads Rennes #14: Programmation Responsive par Celedev
CocoaHeads Rennes #14: Programmation Responsive par CeledevCocoaHeads Rennes #14: Programmation Responsive par Celedev
CocoaHeads Rennes #14: Programmation Responsive par CeledevCocoaHeadsRNS
 
CocoaHeads Rennes #13 : Magical Record
CocoaHeads Rennes #13 : Magical RecordCocoaHeads Rennes #13 : Magical Record
CocoaHeads Rennes #13 : Magical RecordCocoaHeadsRNS
 
CocoaHeads Rennes #13 : CocoaPods
CocoaHeads Rennes #13 : CocoaPodsCocoaHeads Rennes #13 : CocoaPods
CocoaHeads Rennes #13 : CocoaPodsCocoaHeadsRNS
 
CocoaHeads Rennes #10 : Mock Objects
CocoaHeads Rennes #10 : Mock ObjectsCocoaHeads Rennes #10 : Mock Objects
CocoaHeads Rennes #10 : Mock ObjectsCocoaHeadsRNS
 
CocoaHeads Rennes #10 : Notifications
CocoaHeads Rennes #10 : NotificationsCocoaHeads Rennes #10 : Notifications
CocoaHeads Rennes #10 : NotificationsCocoaHeadsRNS
 
CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expert
CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expertCocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expert
CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expertCocoaHeadsRNS
 
CocoaHeads Rennes #7 : Intégration continue pour les nuls
CocoaHeads Rennes #7 : Intégration continue pour les nulsCocoaHeads Rennes #7 : Intégration continue pour les nuls
CocoaHeads Rennes #7 : Intégration continue pour les nulsCocoaHeadsRNS
 
CocoaHeads Rennes #5 : iOS & Android
CocoaHeads Rennes #5 : iOS & AndroidCocoaHeads Rennes #5 : iOS & Android
CocoaHeads Rennes #5 : iOS & AndroidCocoaHeadsRNS
 
CocoaHeads Rennes #4 : la rotation sur iOS
CocoaHeads Rennes #4 : la rotation sur iOSCocoaHeads Rennes #4 : la rotation sur iOS
CocoaHeads Rennes #4 : la rotation sur iOSCocoaHeadsRNS
 
CocoaHeads Rennes #3 : Bien débuter sur iOS
CocoaHeads Rennes #3 : Bien débuter sur iOSCocoaHeads Rennes #3 : Bien débuter sur iOS
CocoaHeads Rennes #3 : Bien débuter sur iOSCocoaHeadsRNS
 
CocoaHeads Rennes #2 : Xcode 4
CocoaHeads Rennes #2 : Xcode 4CocoaHeads Rennes #2 : Xcode 4
CocoaHeads Rennes #2 : Xcode 4CocoaHeadsRNS
 
CocoaHeads Rennes #2 : Pratiques de développement itératif
CocoaHeads Rennes #2 : Pratiques de développement itératifCocoaHeads Rennes #2 : Pratiques de développement itératif
CocoaHeads Rennes #2 : Pratiques de développement itératifCocoaHeadsRNS
 
CocoaHeads Rennes #1 : Grand Central Dispatch
CocoaHeads Rennes #1 : Grand Central DispatchCocoaHeads Rennes #1 : Grand Central Dispatch
CocoaHeads Rennes #1 : Grand Central DispatchCocoaHeadsRNS
 
CocoaHeads Rennes #1 : internationalisation
CocoaHeads Rennes #1 : internationalisationCocoaHeads Rennes #1 : internationalisation
CocoaHeads Rennes #1 : internationalisationCocoaHeadsRNS
 

Más de CocoaHeadsRNS (16)

CocoaHeads Rennes #16: OHHTTPStubs
CocoaHeads Rennes #16: OHHTTPStubsCocoaHeads Rennes #16: OHHTTPStubs
CocoaHeads Rennes #16: OHHTTPStubs
 
CocoaHeads Rennes #14: iOS7 Controllers Transitions
 CocoaHeads Rennes #14: iOS7 Controllers Transitions CocoaHeads Rennes #14: iOS7 Controllers Transitions
CocoaHeads Rennes #14: iOS7 Controllers Transitions
 
CocoaHeads Rennes #14: Programmation Responsive par Celedev
CocoaHeads Rennes #14: Programmation Responsive par CeledevCocoaHeads Rennes #14: Programmation Responsive par Celedev
CocoaHeads Rennes #14: Programmation Responsive par Celedev
 
CocoaHeads Rennes #13 : Magical Record
CocoaHeads Rennes #13 : Magical RecordCocoaHeads Rennes #13 : Magical Record
CocoaHeads Rennes #13 : Magical Record
 
CocoaHeads Rennes #13 : CocoaPods
CocoaHeads Rennes #13 : CocoaPodsCocoaHeads Rennes #13 : CocoaPods
CocoaHeads Rennes #13 : CocoaPods
 
CocoaHeads Rennes #10 : Mock Objects
CocoaHeads Rennes #10 : Mock ObjectsCocoaHeads Rennes #10 : Mock Objects
CocoaHeads Rennes #10 : Mock Objects
 
CocoaHeads Rennes #10 : Notifications
CocoaHeads Rennes #10 : NotificationsCocoaHeads Rennes #10 : Notifications
CocoaHeads Rennes #10 : Notifications
 
CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expert
CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expertCocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expert
CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expert
 
CocoaHeads Rennes #7 : Intégration continue pour les nuls
CocoaHeads Rennes #7 : Intégration continue pour les nulsCocoaHeads Rennes #7 : Intégration continue pour les nuls
CocoaHeads Rennes #7 : Intégration continue pour les nuls
 
CocoaHeads Rennes #5 : iOS & Android
CocoaHeads Rennes #5 : iOS & AndroidCocoaHeads Rennes #5 : iOS & Android
CocoaHeads Rennes #5 : iOS & Android
 
CocoaHeads Rennes #4 : la rotation sur iOS
CocoaHeads Rennes #4 : la rotation sur iOSCocoaHeads Rennes #4 : la rotation sur iOS
CocoaHeads Rennes #4 : la rotation sur iOS
 
CocoaHeads Rennes #3 : Bien débuter sur iOS
CocoaHeads Rennes #3 : Bien débuter sur iOSCocoaHeads Rennes #3 : Bien débuter sur iOS
CocoaHeads Rennes #3 : Bien débuter sur iOS
 
CocoaHeads Rennes #2 : Xcode 4
CocoaHeads Rennes #2 : Xcode 4CocoaHeads Rennes #2 : Xcode 4
CocoaHeads Rennes #2 : Xcode 4
 
CocoaHeads Rennes #2 : Pratiques de développement itératif
CocoaHeads Rennes #2 : Pratiques de développement itératifCocoaHeads Rennes #2 : Pratiques de développement itératif
CocoaHeads Rennes #2 : Pratiques de développement itératif
 
CocoaHeads Rennes #1 : Grand Central Dispatch
CocoaHeads Rennes #1 : Grand Central DispatchCocoaHeads Rennes #1 : Grand Central Dispatch
CocoaHeads Rennes #1 : Grand Central Dispatch
 
CocoaHeads Rennes #1 : internationalisation
CocoaHeads Rennes #1 : internationalisationCocoaHeads Rennes #1 : internationalisation
CocoaHeads Rennes #1 : internationalisation
 

Cocoaheads Rennes #3 : Bien coder sur iOS

  • 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é
  • 3. Coding guidelines « L’important, ce n’est pas les règles, c’est le fait d’en avoir » J.
  • 4. Formatage - (NSURL*) url { ! NSString * url = [NSString stringWithString:kWDGdirectionsBaseURL]; ! NSDictionary * parameters = [self parameters]; ! ! if(parameters) ! { ! BOOL isFirstKey = YES; ! ! ! ! NSString * separator = @"?"; ! ! ! ! ! for (NSString * key in [parameters allKeys]) { ! ! ! url = [url stringByAppendingFormat:@"%@%@=%@", separator, key, [parameters valueForKey:key]]; ! ! ! ! ! ! if(isFirstKey) ! ! { ! ! ! isFirstKey = NO; ! ! ! ! separator = @"&"; ! ! ! } ! ! } ! ! } ! ! ! ! ! url = [url stringByAddingPercentEscapesUsingEncoding: ! ! NSUTF8StringEncoding]; ! return [NSURL URLWithString:url]; }
  • 5. Formatage - (NSURL*) url { ! NSString * url = [NSString stringWithString:kWDGdirectionsBaseURL]; ! NSDictionary * parameters = [self parameters]; ! ! if(parameters) { ! ! BOOL isFirstKey = YES; ! ! NSString * separator = @"?"; ! ! ! ! for (NSString * key in [parameters allKeys]) { ! ! ! url = [url stringByAppendingFormat:@"%@%@=%@", separator, key, [parameters valueForKey:key]]; ! ! ! ! ! ! if(isFirstKey) { ! ! ! ! isFirstKey = NO; ! ! ! ! separator = @"&"; ! ! ! } ! ! } ! } ! url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; ! return [NSURL URLWithString:url]; }
  • 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
  • 9. - (void) displayTopTweets:(NSArray*)tweets { ! if([tweets count] == 4) { ! ! [tweetButton1_.titleLabel setNumberOfLines:2]; ! ! [tweetButton1_ setTitle:[tweets objectAtIndex:0] ! ! ! ! ! forState:UIControlStateNormal]; ! ! [tweetButton1_ setTitle:[[tweets objectAtIndex:0] uppercaseString] ! ! ! ! ! forState:UIControlStateHighlighted]; ! ! [tweetButton1_ setHidden:NO]; ! ! ! [tweetButton2_.titleLabel setNumberOfLines:2]; ! ! [tweetButton2_ setTitle:[tweets objectAtIndex:1] ! ! ! ! ! forState:UIControlStateNormal]; ! ! [tweetButton2_ setTitle:[[tweets objectAtIndex:1] uppercaseString] ! ! ! ! ! forState:UIControlStateHighlighted]; ! ! [tweetButton2_ setHidden:NO]; ! ! ! ! [tweetButton3_.titleLabel setNumberOfLines:2]; ! ! [tweetButton3_ setTitle:[tweets objectAtIndex:2] ! ! ! ! ! forState:UIControlStateNormal]; ! ! [tweetButton3_ setTitle:[[tweets objectAtIndex:2] uppercaseString] ! ! ! ! ! forState:UIControlStateHighlighted]; ! ! [tweetButton3_ setHidden:NO]; ! ! ! ! [tweetButton4_.titleLabel setNumberOfLines:2]; ! ! [tweetButton4_ setTitle:[tweets objectAtIndex:3] ! ! ! ! ! forState:UIControlStateNormal]; ! ! [tweetButton4_ setTitle:[[tweets objectAtIndex:3] uppercaseString] ! ! ! ! ! forState:UIControlStateHighlighted]; ! ! [tweetButton4_ setHidden:NO];!! ! !} }
  • 10. - (void) displayTopTweets:(NSArray*)tweets { ! NSArray * buttons = [NSArray arrayWithObjects:tweetButton1_, tweetButton2_, ! ! ! ! ! ! tweetButton3_, tweetButton4_, nil]; ! if([buttons count] == [tweets count]) { ! ! ! for (NSUInteger i = 0; i < [buttons count]; i++) { ! ! ! UIButton * button = [buttons objectAtIndex:i]; ! ! ! NSString * tweet = [tweets objectAtIndex:i]; ! ! ! ! ! ! [button.titleLabel setNumberOfLines:2]; ! ! ! [button setTitle:tweet ! ! ! ! ! forState:UIControlStateNormal]; ! ! ! [button setTitle:[tweet uppercaseString] ! ! ! ! ! forState:UIControlStateHighlighted]; ! ! ! [button setHidden:NO]; ! ! } ! ! } } ! ! ! !
  • 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
  • 14. Quelles ressources ? Batterie Echanges Mémoire réseau
  • 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
  • 26. La mémoire Rappel: 1 retain / alloc / copy = 1 release
  • 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];
  • 31. Be lazy - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self != nil) { credits_ = [[NSString stringWithContentsOfFile:filePath] retain]; } return self; } - (IBAction) showCredits:(UIButton*) sender { ! [self displayTextPopup:credits_]; } - (void) dealloc { ! [credits_ release]; ! [super dealloc]; }
  • 32. Be lazy - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self != nil) { } return self; } - (NSString*)credits { ! if(!credits_) { credits_ = [[NSString stringWithContentsOfFile:filePath] retain]; ! }! ! return credits_; } - (IBAction) showCredits:(UIButton*) sender { ! [self displayTextPopup:[self credits]]; ! ! } - (void) dealloc { ! [credits_ release]; ! [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
  • 43. Conclusions « Je sens que, ce soir, je vais conclure » Jean-Claude Dusse
  • 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