Tutoriels XCode 4.2 sous Lion

boninmi

Spécialiste en idées générales
Club iGen
4 Avril 2008
6 111
3 472
Dromadaire, ex Ardéchois
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

Bloc de code:
- (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:

Bloc 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):

Bloc de code:
#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 ?
 
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;
 
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;

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.
 
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;

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

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.
 
Dernière édition:
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. :zen:
 
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

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

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

Bloc de code:
.......
@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 :

Bloc de code:
.........
@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 ... :D