# Tutoriels XCode 4.2 sous Lion



## boninmi (25 Octobre 2011)

Ayant téléchargé sur l'AppStore XCode sous Lion:

Version:    4.2 (4D199)
  Location:    /Developer
  Applications:
  Xcode:    4.2 (828)
  Instruments:    4.2 (4233)
  Dashcode:    3.0.2 (336)
  SDKs:
  Mac OS X:
  10,6:    (10K549)
  10,7:    (11C63)

j'ai voulu m'initier au moyen des tutoriels et il semble y avoir quelques problèmes, de versions peut-être.

Tutoriel "Hello":

Le code fourni pour la méthode dealloc 


```
- (void)dealloc {
    // Clean-up code here.
    [super dealloc];
    }
```
conduit à un message d'erreur: ! ARC forbids explicit message send of 'dealloc'

Même chose dans la méthode drawRect pour la ligne de code:


```
[font_attributes release];
```
Néanmoins, la suppression des lignes de code signalées conduit à une compilation et exécution correcte.

Tutoriel "Designing a User Interface with Interface Builder":

Ce programme affiche une animation au format Quartz .qtz . Il est proposé l'ajout d'un bouton "Load" permettant de changer d'animation. Le code correspondant à cette action est fourni (méthode loadComposition):


```
#import "AppDelegate.h"

@implementation AppDelegate

@synthesize window = _window;
@synthesize qcView = _qcView;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
}

- (IBAction)loadComposition:(id)sender {void (^handler)(NSInteger);
    
    NSOpenPanel *panel = [NSOpenPanel openPanel];
    
    [panel setAllowedFileTypes:[NSArray arrayWithObjects: @"qtz", nil]];
    
    handler = ^(NSInteger result) {
        if (result == NSFileHandlingPanelOKButton) {
            NSString *filePath = [[[panel URLs] objectAtIndex:0] path];
            if (![qcView loadCompositionFromFile:filePath]) {
                NSLog(@"Could not load composition");
            }
        }
    };
    
    [panel beginSheetModalForWindow:window completionHandler:handler];
    

}
@end
```
L'appui sur le bouton "Load" permet bien de choisir un des .qtz disponibles, mais la nouvelle animation ne se charge pas et la console affiche le message d'erreur prévu:

*2011-10-25 13:54:27.403 QCDemo[329:707] Could not load composition*

Quelqu'un est-il capable de fournir un correctif ?


----------



## Nyx0uf (25 Octobre 2011)

Par défaut Xcode 4.2 crée les projets avec ARC activé. Et ARC rend invalide la gestion de mémoire de manière manuelle.

Donc release / retain / autorelease provoqueront une erreur de compilation.

Soit tu désactives ARC dans les propriétés de ton projet et tu continues de gérer la mémorie manuellement :

Build settings -> Apple LLVM compiler 3.0 - Language -> Objective-C Automatic Reference Couting : NO

Soit tu laisses faire ARC et donc tu enlèves le code qui gère la mémoire;


----------



## boninmi (25 Octobre 2011)

Nyx0uf a dit:


> Par défaut Xcode 4.2 crée les projets avec ARC activé. Et ARC rend invalide la gestion de mémoire de manière manuelle.
> 
> Donc release / retain / autorelease provoqueront une erreur de compilation.
> 
> ...



OK. Et pour le deuxième tutoriel, le bouton "Load" qui ne conduit pas jusqu'au remplacement de l'animation, tu as une idée ? A certains endroits (au moins un), il y a des cases à cocher différentes / absentes par rapport à celles du tutoriel. Et le code

@property (*weak*) IBOutlet QCView *qcView;

est proposé au lieu de (dans le tutoriel)

@property (*assign*) IBOutlet QCView *qcView;

mais ça ne semble rien modifier dans l'exécution.


----------



## boninmi (26 Octobre 2011)

Nyx0uf a dit:


> Par défaut Xcode 4.2 crée les projets avec ARC activé. Et ARC rend invalide la gestion de mémoire de manière manuelle.
> 
> Donc release / retain / autorelease provoqueront une erreur de compilation.
> 
> ...



OK, j'ai trouvé ... en cherchant un peu 

Fenêtre de projet, sélectionner le projet, en haut, à gauche (icone bleue avec un A dedans)
-> dans la colonne qui apparaît à droite, sélectionner de nouveau le projet, en haut
-> dans la zone de nouveau plus à droite, chercher en descendant l'onglet "Apple LLVM compiler 3.0 - Language" et l'ouvrir
-> faire passer le champ "Objective-C Automatic Reference Couting" à No
-> cliquer sur le bouton du milieu en bas "Validate settings"

La compilation et l'exécution fonctionnent. Cas réglé pour le Tutoriel Hello.


----------



## boninmi (9 Décembre 2011)

Je n'ai pas encore repris à zéro le tutoriel QCDemo. J'ai cherché à progresser parallèlement par des voies diverses. Le problème est que les tutoriels proposés ne sont pour la plupart pas à jour par rapport aux changements introduits pas XCode 4.2. Aussi je recommande vivement le tutoriel ci dessous élaboré par Apple. Malgré une ou deux coquilles, il est cohérent avec la version 4.2, le code est simple, les concepts cependant abordés en profondeur et ... le programme marche, ce qui n'est pas négligeable. 

http://developer.apple.com/library/...nceptual/Mac101/Articles/00_Introduction.html

A signaler la mise à jour récent de XCode 4.2 disponible via l'AppStore.


----------



## boninmi (12 Décembre 2011)

Reprise à zéro du tutoriel QCDemo (XCode Quick Start Guide). Effectivement il s'agit d'un problème de différences de versions.

Code produit par une version antérieure à 4.2 Build 4D199 pour QCDemoAppDelegate.h


```
@interface QCDemoAppDelegate : NSObject <NSApplicationDelegate> {
@private
    NSWindow *window;
    QCView *qcView;
}
```
Code produit par 4.2 pour AppDelegate.h (le QCDemo a disparu du nom):


```
@interface AppDelegate : NSObject <NSApplicationDelegate>
```
Code produit par la version antérieure pour QCDemoAppDelegate.m


```
.......
@synthesize window;
@synthesize qcView;
.......
- (IBAction)loadComposition:(id)sender {
  void (^handler)(NSInteger);
 
  NSOpenPanel *panel = [NSOpenPanel openPanel];
 
  [panel setAllowedFileTypes:[NSArray arrayWithObjects: @"qtz", nil]];
 
  handler = ^(NSInteger result) {
      if (result == NSFileHandlingPanelOKButton) {
          NSString *filePath = [[[panel URLs] objectAtIndex:0] path];
          if (![[B]qcView[/B] loadCompositionFromFile:filePath]) {
              NSLog(@"Could not load composition");
          }
      }
  };
}
 
[panel beginSheetModalForWindow:[B]window[/B] completionHandler:handler];
```
Code produit par 4.2 pour AppDelegate.m :


```
.........
@synthesize window = [B]_window[/B];
@synthesize qcView = [B]_qcView[/B];
..........
```
et donc il faut modifier le code de loadComposition cité plus haut en ajoutant les tirets _ devant les identificateurs *qcview* et *window*. 

Les deux versions de code fonctionnent, mais j'avais dû faire un savant mélange faute de regarder attentivement. Sans doute pas très gênant pour un habitué, mais ennuyeux pour un tutoriel. Il est vrai que ce fil n'a pas suscité des tonnes de réactions ...


----------

