iOS & Android
le meilleur des deux mondes
                      Nicolas Klein - David Bonnet
                                   Novembre 2011
David Bonnet
  iOS Developer - Mobile fan - Android newbie




                  CarMusic
CarMusic




Sur Android en 2012
Nicolas Klein
            Développeur Android expert - iPhone intermédiaire


• Applications :
  • WishList
  • Aion Profile Viewer

• Framework :
  • DataDroid : gestion des donnees locales et distantes
iOS & Android
• Environnement           • Ressources et
                           Internationalisation
• Interface utilisateur
                          • Open Source
• Fragmentation
                          • Bibliothèques tierces
• Le cœur du système
                          • La gestion mémoire
• Multi-tâches
L’environnement
Déploiement

Interne :                        3 types d’APK :

       AdHoc       Enterprise       APK de             APK      APK non
                                 développement         signé     signé

      Manuelle    Over The Air
                                 Rapidité	
  de	
  valida,on	
  :
Sortie :                          • Instantané - 10 min au max
                                  • Correction d’un bug rapidement
             Sous réserve de      • Pas de contraintes bizarres
                validation        • Post validation
Validation des applications
   Premier filtrage sur les applications

                          Impose certaines contraintes de développement

            Consommation réseau maîtrisée

                   Temps de validation considérablement raccourci
    Validation stricte
                                                   Sécurité accrue

Nécessité d’attendre la validation en cas de bug
Sécurité

iTunes Connect
                                     Android Market
 • Login/mdp du compte développeur    • Login/mdp du compte développeur
 • Certificat et provisionning de      • Keystore
   distribution
                                     Gestion du piratage
Gestion du piratage

 • à la charge du développeur         • Licence Validation Library (LVL)

 • In App Purchase                    • In App Purchase
Cycle de vie de l’application

Statistiques                            Statistiques
 • iTunes Connect Sales report très       • Nombre téléchargements
   limité                                   Totaux / Actifs + Courbe
 • Des outils tiers sauvent la mise       • Répartition par version d’OS,
                                            terminal, pays, langue
Rapports de crashs remontés               •
                                        Depuis 2.2, crashs remontés par les
automatiquement depuis iPhone OS 2.0
                                        utilisateurs
Commentaires et notes
                                        Commentaires et notes
 • Liés à la version de l’application     • Bientôt possibilité de répondre
 • Notes sans commentaire possible        • Pas par version
Cycle de vie de l’application

Statistiques                            Statistiques
 • iTunes Connect Sales report très       • Nombre téléchargements
   limité                                   Totaux / Actifs + Courbe
 • Des outils tiers sauvent la mise       • Répartition par version d’OS,
                                            terminal, pays, langue
Rapports de crashs remontés               •
                                        Depuis 2.2, crashs remontés par les
automatiquement depuis iPhone OS 2.0
                                        utilisateurs
Commentaires et notes
                                        Commentaires et notes
 • Liés à la version de l’application     • Bientôt possibilité de répondre
 • Notes sans commentaire possible        • Pas par version
Cycle de vie de l’application

Statistiques                            Statistiques
 • iTunes Connect Sales report très       • Nombre téléchargements
   limité                                   Totaux / Actifs + Courbe
 • Des outils tiers sauvent la mise       • Répartition par version d’OS,
                                            terminal, pays, langue
Rapports de crashs remontés               •
                                        Depuis 2.2, crashs remontés par les
automatiquement depuis iPhone OS 2.0
                                        utilisateurs
Commentaires et notes
                                        Commentaires et notes
 • Liés à la version de l’application     • Bientôt possibilité de répondre
 • Notes sans commentaire possible        • Pas par version
Catégories disponibles

                         •   Top New Free
                         •   Top New Paid
• Top Grossing           •   Top Grossing
• Top Free               •   Top Free
• Top Paid               •   Top Paid


• More from Developer    • More from Developer
                         • Super Developer
• Apple week selection   • Editor’s choice
L’interface utilisateur
Disposition des éléments

• Absolu             On est certain du                         On connait la disposition
                       rendu final          •   Relatif
                                                              des éléments et le rendu sur
                                                                    certains appareils
• Résolution fixe (en points) sur iPhone
                                           •   Multi-terminaux
  • Définition supérieure sur certains
     terminaux                             • Multi résolutions
• Le futur ? S’adapter pour tirer          • Gestion multi-résolution par multi-
  pleinement parti du périphérique             fichier ou padding


• Uniquement des Téléphones et Tablettes   • de la Télévision au Téléphone en passant
  disponibles au développement                 par l’Auto-radio
Multi densité des écrans

• Multiple entier de la résolution native de   • Les multi densités sur Android sont
  l’iPhone original                              représentées par des dossiers :
  • iPhone : 320x480                               •   Drawable
  • iPhone Retina : 640x960 (x2)                   •   Drawable-ldpi
                                                   •   Drawable-mdpi
• Ajout du suffixe correspondant au                 •   Drawable-hdpi
  multiple sur l’image
                                                   •   Drawable-xhdpi
  • image.png
  • image@2x.png
Gestion Portrait / Paysage

• UIAutoresizingMask                   • Resizing automatique via les
                                          layout du SDK
  • Redimentionnement automatique
    des éléments
  • Suffisant dans la plupart des cas

• Repositionnement via la              • Possibilité d’avoir un fichier différent
  méthode layoutSubviews                 pour chaque orientation
  parfois nécessaire                        • Exemple : layout et layout-land
                                            • Géré automatiquement par le
                                              système
Liaison Fichier UI / Code

• IBOutlet                               • findViewById
  • Syntaxe lourde                         • Accès simple à un élément de
  • Généré nativement par Xcode 4             l’interface
                                           • Accès via l’Activité parente
• viewByTag                              • Problèmes :
  • Appel d’une vue par son tag sur la     • Tout id défini est récupérable !
    vue parente (superview)                • Passage systématique par un cast
  • Peu conseillé                          • Nécessite d’être rigoureux
Simulateur et émulateur
Simulateur / Emulateur

• Simule iOS sur une architecture x86 /   • Emule le hardware sur une machine
  x86_64                                    virtuelle armv7
• Permet de se « rendre compte » du       • Attention : Lourd à exécuter !
  rendu de l’application
                                            • Possibilité de snapshots
• Attention : Environnement parfait !



Il est important de tester sur le système réel !
Fragmentation sur Android
Fragmentation
•   Soit disant problème d’Android
•   Quasiment aucun impact sur le développement
    •   Un problème remonté par la presse et le marketing


•   Problème sur les surcouches


•   OS pensé pour d’autres systèmes que les smartphones et
    tablettes contrairement à iOS
    •   Google TV / Parrot Asteroid
Le cœur du système
Héritages de JAVA 5

•   Les bases de JAVA sont disponibles :

    •   Exemples : java.lang - java.util- java.io - java.sql - java.net


•   Quelques surcouches Android :

    •   Exemples : android.net - android.util - android.database
Nouveautés propre au système
                                android.nfc
   android.gesture
                                         android.telephony
                 android.location
android.opengl                                  android.widget
                              android.view                       ...




                     Nombreux ajouts en surcouche
Héritage de Cocoa

•   Les bases de CoreOS sont disponibles

    •   Exemples : CoreFoundation - CoreGraphics - CoreData -
        CoreNetwork - ...



                    Enrichissement des bases
                        CoreImage     GLKit     CoreBluetooth
Multi-tâches
Multi-tâches

• Contrôle maîtrisé par le système   • Tout est possible via les Services
  1. Background Audio                  • Le développeur doit faire la part
                                          des choses
  2. Voice over IP
  3. Background location
                                     • Déclenchement
  4. Push Notifications
                                       • via Intent
  5. Local Notifications
                                       • à une date donnée
  6. Task completion
                                       • à un évènement donné
  7. Fast app switching
                                          (boot, connexion)
Notifications / Widgets
Ressources et Internationalisation
Ressources

• Possiblité de créer des Bundles          • Ressources externalisables dans des
                                             fichiers XML

• Localisation avec un fichier strings :      • strings / layouts / dimens / anims / ...
  • fr_FR.lproj/Localizable.string
   (en français)
                                           • Localisation en ajoutant des suffixes
                                             aux répertoires concernés :
  • en_US.lproj/Localizable.strings          • values/strings.xml (par défaut)
   (en américain)
                                             • values-fr/strings.xml (en français)
  • Langue par défaut dans le info.plist     • values-fr-CA/strings.xml
                                                (en québéquois)
Open Source

• Bases Open Source                         • Totalement Open Source (AOSP :
                                              http://source.android.com/)
  • http://opensource.apple.com/
  • http://developer.apple.com/               • Facilité pour débugger
    opensource/                               • Permet de progresser

• Certaines bibliothèques Apple sont Open   • Cas spécial Honeycomb (3.0)
 Source
                                              • Code non optimal
 • Grand Central Dispath (GCD)                • Non prévu pour Smartphone
 • WebKit                                     • Résolu avec Ice Cream Sandwich
 • Bonjour / LLVM / Noyau Darwin                (4.0)
Bibliothèques tierces
Bibliothèques tierces

• Intégration de bibliothèques                • Intégration de bibliothèques
  • Seulement des bibliothèques statiques !      • Tout est permis
  • Bibliothèques dynamiques réservées au        • Intégration de .jar
    système (possible sur OS X)
                                                 • Android Project Library

• Utilisation des frameworks privés iOS       • Utilisation des frameworks privés
  interdite et détectée à la validation
                                                Android via l’inclusion du code source

• Chameleon project : reproduction UIKit
  sur OS X (http://chameleonproject.org/)
La Gestion mémoire
Gestion mémoire

• Reference-counting                     • Garbage collector
  • Le développeur gère la mémoire de      • Pas de gestion mémoire à réaliser
    son application                           par le développeur
 • Retain / Alloc / New / Copy (+1)        • Imprévisible
 • Autorelease / Release (-1)              • Bloque tout traitement dont l’UI
• SDK 4.3 et inférieur                   • Avant 2.3
  • Gestion de la mémoire                  • 100ms de pause pour le GC
    « manuellement »
                                         • Depuis 2.3
• SDK 5.0 et supérieur
                                           • Parallel GC    Quasi invisible
  • ARC (Automatic Reference Counting)
Ecrivons une pile...
public class Stack<T> {

    private ArrayList<T> mList;

    public Stack() {
       mList = new ArrayList<T>();
    }
    public void push(T x) {
      mList.add(x);
    }
    public T pop() {
      final T x = mList.get(mList.size() - 1);
      mList.remove(x);
      return x;
    }
}
Ecrivons une pile...
@implementation Stack { NSMutableArray *_array; }
- (id) init {
  if (self = [super init])
     _array = [NSMutableArray array];
                                      Tableau en autorelease !
  return self;
                                      Le système peut s’en séparer à
}
                                      n’importe quel moment
- (void) push: (id) x {
  [_array addObject: x];
}
- (id) pop {
  id x = [_array lastObject];
  [_array removeLastObject];
  return x;
}
@end
                                                  (WWDC 2011 : 323 Introduction to ARC)
Ecrivons une pile...
@implementation Stack { NSMutableArray *_array; }
- (id) init {
  if (self = [super init])
     _array = [[NSMutableArray array] retain];
  return self;
}                                         Désormais il y a une
- (void) push: (id) x {                   fuite mémoire !
  [_array addObject: x];                  Ajoutons une méthode dealloc
}
- (id) pop {
  id x = [_array lastObject];
  [_array removeLastObject];
  return x;
}
@end
                                                 (WWDC 2011 : 323 Introduction to ARC)
Ecrivons une pile...
@implementation Stack { NSMutableArray *_array; }
- (id) init {
  if (self = [super init])
     _array = [[NSMutableArray array] retain];
  return self;
}
- (void) push: (id) x {
  [_array addObject: x];
}
- (id) pop {                     x peut-être libéré à
  id x = [_array lastObject];    tout moment !
  [_array removeLastObject];     Fonctionne seulement si x est
  return x;                      référencé ailleurs
}
- (void) dealloc { [_array release]; [super dealloc]; }
@end
                                                 (WWDC 2011 : 323 Introduction to ARC)
Ecrivons une pile...
@implementation Stack { NSMutableArray *_array; }
- (id) init {
  if (self = [super init])
     _array = [[NSMutableArray array] retain];
  return self;
}
- (void) push: (id) x {
  [_array addObject: x];
}
- (id) pop {                             Désormais on retourne
  id x = [[_array lastObject] retain]; un pointeur retenu!
  [_array removeLastObject];             On viole la convention, une
  return x;                              fiute est à prévoir
}
- (void) dealloc { [_array release]; [super dealloc]; }
@end
                                                  (WWDC 2011 : 323 Introduction to ARC)
Ecrivons une pile...
@implementation Stack { NSMutableArray *_array; }
- (id) init {
  if (self = [super init])
     _array = [[NSMutableArray array] retain];
  return self;
}
- (void) push: (id) x {
  [_array addObject: x];
}
- (id) pop {
  id x = [[_array lastObject] retain];
  [_array removeLastObject];
  return [x autorelease];
}
- (void) dealloc { [_array release]; [super dealloc]; }
@end
                                           (WWDC 2011 : 323 Introduction to ARC)
Ecrivons une pile...
@implementation Stack { NSMutableArray *_array; }
- (id) init {
  if (self = [super init])
     _array = [[NSMutableArray array] retain];
  return self;
}
- (void) push: (id) x {
  [_array addObject: x];
}
- (id) pop {
  id x = [[_array lastObject] retain];
  [_array removeLastObject];
  return [x autorelease];
}
- (void) dealloc { [_array release]; [super dealloc]; }
@end
                                           (WWDC 2011 : 323 Introduction to ARC)
Ecrivons une pile...
@implementation Stack { NSMutableArray *_array; }
- (id) init {
  if (self = [super init])
     _array = [NSMutableArray array];
  return self;
}
- (void) push: (id) x {
  [_array addObject: x];
}
- (id) pop {
  id x = [_array lastObject];
  [_array removeLastObject];
  return x;
}
@end
                                           (WWDC 2011 : 323 Introduction to ARC)
Conclusion




  Arrivés à maturité, les deux systèmes sont
  désormais très proches tout en offrant une
       expérience utilisateur différente.
CocoaHeads #5                 julien@cocoaheads.fr
                http://cocoaheads.fr          thomas.dupont@cocoaheads.fr



iOS & Android
        Mail : nicolas@foxykeep.com
      Twitter : @foxykeep

  Framework : DataDroid
        App : Wishlist - Aion Profile Viewer

        Mail : david.bonnet85@gmail.com
      Twitter : @davidbonnet85

         App : CarMusic

CocoaHeads Rennes #5 : iOS & Android

  • 1.
    iOS & Android lemeilleur des deux mondes Nicolas Klein - David Bonnet Novembre 2011
  • 2.
    David Bonnet iOS Developer - Mobile fan - Android newbie CarMusic
  • 3.
  • 4.
    Nicolas Klein Développeur Android expert - iPhone intermédiaire • Applications : • WishList • Aion Profile Viewer • Framework : • DataDroid : gestion des donnees locales et distantes
  • 5.
    iOS & Android •Environnement • Ressources et Internationalisation • Interface utilisateur • Open Source • Fragmentation • Bibliothèques tierces • Le cœur du système • La gestion mémoire • Multi-tâches
  • 6.
  • 7.
    Déploiement Interne : 3 types d’APK : AdHoc Enterprise APK de APK APK non développement signé signé Manuelle Over The Air Rapidité  de  valida,on  : Sortie : • Instantané - 10 min au max • Correction d’un bug rapidement Sous réserve de • Pas de contraintes bizarres validation • Post validation
  • 8.
    Validation des applications Premier filtrage sur les applications Impose certaines contraintes de développement Consommation réseau maîtrisée Temps de validation considérablement raccourci Validation stricte Sécurité accrue Nécessité d’attendre la validation en cas de bug
  • 9.
    Sécurité iTunes Connect Android Market • Login/mdp du compte développeur • Login/mdp du compte développeur • Certificat et provisionning de • Keystore distribution Gestion du piratage Gestion du piratage • à la charge du développeur • Licence Validation Library (LVL) • In App Purchase • In App Purchase
  • 10.
    Cycle de viede l’application Statistiques Statistiques • iTunes Connect Sales report très • Nombre téléchargements limité Totaux / Actifs + Courbe • Des outils tiers sauvent la mise • Répartition par version d’OS, terminal, pays, langue Rapports de crashs remontés • Depuis 2.2, crashs remontés par les automatiquement depuis iPhone OS 2.0 utilisateurs Commentaires et notes Commentaires et notes • Liés à la version de l’application • Bientôt possibilité de répondre • Notes sans commentaire possible • Pas par version
  • 11.
    Cycle de viede l’application Statistiques Statistiques • iTunes Connect Sales report très • Nombre téléchargements limité Totaux / Actifs + Courbe • Des outils tiers sauvent la mise • Répartition par version d’OS, terminal, pays, langue Rapports de crashs remontés • Depuis 2.2, crashs remontés par les automatiquement depuis iPhone OS 2.0 utilisateurs Commentaires et notes Commentaires et notes • Liés à la version de l’application • Bientôt possibilité de répondre • Notes sans commentaire possible • Pas par version
  • 12.
    Cycle de viede l’application Statistiques Statistiques • iTunes Connect Sales report très • Nombre téléchargements limité Totaux / Actifs + Courbe • Des outils tiers sauvent la mise • Répartition par version d’OS, terminal, pays, langue Rapports de crashs remontés • Depuis 2.2, crashs remontés par les automatiquement depuis iPhone OS 2.0 utilisateurs Commentaires et notes Commentaires et notes • Liés à la version de l’application • Bientôt possibilité de répondre • Notes sans commentaire possible • Pas par version
  • 13.
    Catégories disponibles • Top New Free • Top New Paid • Top Grossing • Top Grossing • Top Free • Top Free • Top Paid • Top Paid • More from Developer • More from Developer • Super Developer • Apple week selection • Editor’s choice
  • 14.
  • 15.
    Disposition des éléments •Absolu On est certain du On connait la disposition rendu final • Relatif des éléments et le rendu sur certains appareils • Résolution fixe (en points) sur iPhone • Multi-terminaux • Définition supérieure sur certains terminaux • Multi résolutions • Le futur ? S’adapter pour tirer • Gestion multi-résolution par multi- pleinement parti du périphérique fichier ou padding • Uniquement des Téléphones et Tablettes • de la Télévision au Téléphone en passant disponibles au développement par l’Auto-radio
  • 16.
    Multi densité desécrans • Multiple entier de la résolution native de • Les multi densités sur Android sont l’iPhone original représentées par des dossiers : • iPhone : 320x480 • Drawable • iPhone Retina : 640x960 (x2) • Drawable-ldpi • Drawable-mdpi • Ajout du suffixe correspondant au • Drawable-hdpi multiple sur l’image • Drawable-xhdpi • image.png • image@2x.png
  • 17.
    Gestion Portrait /Paysage • UIAutoresizingMask • Resizing automatique via les layout du SDK • Redimentionnement automatique des éléments • Suffisant dans la plupart des cas • Repositionnement via la • Possibilité d’avoir un fichier différent méthode layoutSubviews pour chaque orientation parfois nécessaire • Exemple : layout et layout-land • Géré automatiquement par le système
  • 18.
    Liaison Fichier UI/ Code • IBOutlet • findViewById • Syntaxe lourde • Accès simple à un élément de • Généré nativement par Xcode 4 l’interface • Accès via l’Activité parente • viewByTag • Problèmes : • Appel d’une vue par son tag sur la • Tout id défini est récupérable ! vue parente (superview) • Passage systématique par un cast • Peu conseillé • Nécessite d’être rigoureux
  • 19.
  • 20.
    Simulateur / Emulateur •Simule iOS sur une architecture x86 / • Emule le hardware sur une machine x86_64 virtuelle armv7 • Permet de se « rendre compte » du • Attention : Lourd à exécuter ! rendu de l’application • Possibilité de snapshots • Attention : Environnement parfait ! Il est important de tester sur le système réel !
  • 21.
  • 22.
    Fragmentation • Soit disant problème d’Android • Quasiment aucun impact sur le développement • Un problème remonté par la presse et le marketing • Problème sur les surcouches • OS pensé pour d’autres systèmes que les smartphones et tablettes contrairement à iOS • Google TV / Parrot Asteroid
  • 23.
    Le cœur dusystème
  • 24.
    Héritages de JAVA5 • Les bases de JAVA sont disponibles : • Exemples : java.lang - java.util- java.io - java.sql - java.net • Quelques surcouches Android : • Exemples : android.net - android.util - android.database
  • 25.
    Nouveautés propre ausystème android.nfc android.gesture android.telephony android.location android.opengl android.widget android.view ... Nombreux ajouts en surcouche
  • 26.
    Héritage de Cocoa • Les bases de CoreOS sont disponibles • Exemples : CoreFoundation - CoreGraphics - CoreData - CoreNetwork - ... Enrichissement des bases CoreImage GLKit CoreBluetooth
  • 27.
  • 28.
    Multi-tâches • Contrôle maîtrisépar le système • Tout est possible via les Services 1. Background Audio • Le développeur doit faire la part des choses 2. Voice over IP 3. Background location • Déclenchement 4. Push Notifications • via Intent 5. Local Notifications • à une date donnée 6. Task completion • à un évènement donné 7. Fast app switching (boot, connexion)
  • 29.
  • 30.
  • 31.
    Ressources • Possiblité decréer des Bundles • Ressources externalisables dans des fichiers XML • Localisation avec un fichier strings : • strings / layouts / dimens / anims / ... • fr_FR.lproj/Localizable.string (en français) • Localisation en ajoutant des suffixes aux répertoires concernés : • en_US.lproj/Localizable.strings • values/strings.xml (par défaut) (en américain) • values-fr/strings.xml (en français) • Langue par défaut dans le info.plist • values-fr-CA/strings.xml (en québéquois)
  • 33.
    Open Source • BasesOpen Source • Totalement Open Source (AOSP : http://source.android.com/) • http://opensource.apple.com/ • http://developer.apple.com/ • Facilité pour débugger opensource/ • Permet de progresser • Certaines bibliothèques Apple sont Open • Cas spécial Honeycomb (3.0) Source • Code non optimal • Grand Central Dispath (GCD) • Non prévu pour Smartphone • WebKit • Résolu avec Ice Cream Sandwich • Bonjour / LLVM / Noyau Darwin (4.0)
  • 34.
  • 35.
    Bibliothèques tierces • Intégrationde bibliothèques • Intégration de bibliothèques • Seulement des bibliothèques statiques ! • Tout est permis • Bibliothèques dynamiques réservées au • Intégration de .jar système (possible sur OS X) • Android Project Library • Utilisation des frameworks privés iOS • Utilisation des frameworks privés interdite et détectée à la validation Android via l’inclusion du code source • Chameleon project : reproduction UIKit sur OS X (http://chameleonproject.org/)
  • 36.
  • 37.
    Gestion mémoire • Reference-counting • Garbage collector • Le développeur gère la mémoire de • Pas de gestion mémoire à réaliser son application par le développeur • Retain / Alloc / New / Copy (+1) • Imprévisible • Autorelease / Release (-1) • Bloque tout traitement dont l’UI • SDK 4.3 et inférieur • Avant 2.3 • Gestion de la mémoire • 100ms de pause pour le GC « manuellement » • Depuis 2.3 • SDK 5.0 et supérieur • Parallel GC Quasi invisible • ARC (Automatic Reference Counting)
  • 38.
    Ecrivons une pile... publicclass Stack<T> { private ArrayList<T> mList; public Stack() { mList = new ArrayList<T>(); } public void push(T x) { mList.add(x); } public T pop() { final T x = mList.get(mList.size() - 1); mList.remove(x); return x; } }
  • 39.
    Ecrivons une pile... @implementationStack { NSMutableArray *_array; } - (id) init { if (self = [super init]) _array = [NSMutableArray array]; Tableau en autorelease ! return self; Le système peut s’en séparer à } n’importe quel moment - (void) push: (id) x { [_array addObject: x]; } - (id) pop { id x = [_array lastObject]; [_array removeLastObject]; return x; } @end (WWDC 2011 : 323 Introduction to ARC)
  • 40.
    Ecrivons une pile... @implementationStack { NSMutableArray *_array; } - (id) init { if (self = [super init]) _array = [[NSMutableArray array] retain]; return self; } Désormais il y a une - (void) push: (id) x { fuite mémoire ! [_array addObject: x]; Ajoutons une méthode dealloc } - (id) pop { id x = [_array lastObject]; [_array removeLastObject]; return x; } @end (WWDC 2011 : 323 Introduction to ARC)
  • 41.
    Ecrivons une pile... @implementationStack { NSMutableArray *_array; } - (id) init { if (self = [super init]) _array = [[NSMutableArray array] retain]; return self; } - (void) push: (id) x { [_array addObject: x]; } - (id) pop { x peut-être libéré à id x = [_array lastObject]; tout moment ! [_array removeLastObject]; Fonctionne seulement si x est return x; référencé ailleurs } - (void) dealloc { [_array release]; [super dealloc]; } @end (WWDC 2011 : 323 Introduction to ARC)
  • 42.
    Ecrivons une pile... @implementationStack { NSMutableArray *_array; } - (id) init { if (self = [super init]) _array = [[NSMutableArray array] retain]; return self; } - (void) push: (id) x { [_array addObject: x]; } - (id) pop { Désormais on retourne id x = [[_array lastObject] retain]; un pointeur retenu! [_array removeLastObject]; On viole la convention, une return x; fiute est à prévoir } - (void) dealloc { [_array release]; [super dealloc]; } @end (WWDC 2011 : 323 Introduction to ARC)
  • 43.
    Ecrivons une pile... @implementationStack { NSMutableArray *_array; } - (id) init { if (self = [super init]) _array = [[NSMutableArray array] retain]; return self; } - (void) push: (id) x { [_array addObject: x]; } - (id) pop { id x = [[_array lastObject] retain]; [_array removeLastObject]; return [x autorelease]; } - (void) dealloc { [_array release]; [super dealloc]; } @end (WWDC 2011 : 323 Introduction to ARC)
  • 44.
    Ecrivons une pile... @implementationStack { NSMutableArray *_array; } - (id) init { if (self = [super init]) _array = [[NSMutableArray array] retain]; return self; } - (void) push: (id) x { [_array addObject: x]; } - (id) pop { id x = [[_array lastObject] retain]; [_array removeLastObject]; return [x autorelease]; } - (void) dealloc { [_array release]; [super dealloc]; } @end (WWDC 2011 : 323 Introduction to ARC)
  • 45.
    Ecrivons une pile... @implementationStack { NSMutableArray *_array; } - (id) init { if (self = [super init]) _array = [NSMutableArray array]; return self; } - (void) push: (id) x { [_array addObject: x]; } - (id) pop { id x = [_array lastObject]; [_array removeLastObject]; return x; } @end (WWDC 2011 : 323 Introduction to ARC)
  • 46.
    Conclusion Arrivésà maturité, les deux systèmes sont désormais très proches tout en offrant une expérience utilisateur différente.
  • 47.
    CocoaHeads #5 julien@cocoaheads.fr http://cocoaheads.fr thomas.dupont@cocoaheads.fr iOS & Android Mail : nicolas@foxykeep.com Twitter : @foxykeep Framework : DataDroid App : Wishlist - Aion Profile Viewer Mail : david.bonnet85@gmail.com Twitter : @davidbonnet85 App : CarMusic