Débuter en Objective-C

greensource

Membre actif
1 Décembre 2005
150
1
Rennes
Bonjour, je suis en L3info et je programme en java sous eclipse. J'aimerais pouvoir transcrire mes TPs en Objective-C par moi même. Le souci c'est qu'avec X-code je n'arrive pas à faire ce que je fais avec eclipse, à savoir, faire une classe toute bête et faire des tests sur la console. J'ai jamais reussi a trouver une console avec X-code ;) je suis débutant aussi ^^
Donc voilà si quelqu'un à une réponse, merci d'avance...
 
Me revoilà! Merci pour les liens, je suis aller jeter un coup d'oeil. J'ai vite compris qu'il falais déjà me mettre à jour avec le C pour commencer en OBJC. Ce que j'ai fait. Donc j'ai enfin pu commencer les bases de OBJC. Sauf que je suis déjà bloquer, sur des trucs hyper simple. En gros j'ai créer une classe Coord pour créer un point (coordonnées x et y, le truc de base quoi):
#import "Coord.h"
@implementation Coord
-(Coord)init: (int) x: (int) y{
abs=x;
ord=y;
}
-(void)display{
pritnf("Abscisse: %ld\n",abs);
pritnf("Ordonnee: %ld\n",crd);
}
@end
Et l'interfacce qui va avec:
#import <Cocoa/Cocoa.h>
@interface Coord : NSObject {
int abs;
int ord;
}
-(Coord)init: (int) x: (int) y;
-(void)display;
@end
Voilà ensuite j'essais de créer un nouvel objet Coord dans le main puis de l'afficher main j'ai une erreur:
#import <Cocoa/Cocoa.h>
#import "Coord.h"
int main(int argc, char *argv[])
{
Coord monPoint*= [[Coord alloc] init:10:15];
[monPoint display];
return 0;
}
L'erreur c'est: "can not use an object as parameter to a methode", ça m'affiche çaà l'implémentation de la methode init et aussi la ou je fais les imports Coord.h

Bon moi en gros je sais faire que du Java, donc j'ai probablement utilisé de mauvais mécanisme. En gros ce que je veux faire c'est une classe qui créer des points, en créer un dans le main puis l'afficher.
Je vais avoir un bouquin demain sur cocoa mais si quelqu'un a gentiment envi de m'aider en attendant c'est pas de refus ;-)
Merci

ps: je me rappel avoir trouvé dans Xcode une fois l'ensemble de la doc des méthodes Objective-C. Je ne me rappel plus malheureusement, si quelqu'un vois de quoi je parle.++ (retrouvé:aide>documentation ;))
 
Salut,

Bon, je vais &#234;tre franc, &#231;a va pas marcher du tout :)

Ya quelques erreurs grossi&#232;res:
Bloc de code:
Coord* monPoint= [[Coord alloc] init:10:15];  // pointeur de Coord

...

@implementation Coord
-(Coord)init: (int) x: (int) y{
abs=x;
ord=y;
             [COLOR="Red"] &#231;a retourne rien :) [/COLOR]
}

Mais en plus, tu veux cr&#233;er un objet qui dessine dans une fen&#234;tre et c'est pas vraiment le plus simple pour d&#233;buter...

Je te conseillerais une approche plus concr&#232;te:
Tu cr&#233;es un projet Cocoa Application et tu fais build&Run et d&#233;j&#224; tu as une fen&#234;tre qui s'affiche :)
Maintenant tu vas double-cliquer sur MainMenu.nib dans Xcode (Resources) pour lancer Interface Builder.
Dans IB tu cliques sur l'onglet Classes, puis compl&#232;tement &#224; gauche tu vas fair un clic-droit sur NSObject et choisir SubClass NSObject. Renomme la class en Controller. Encore un clic-droit et choisis Instantiate Controller. Tu dois avoir un nouvel object (cube bleu) dans Instances. Enfin retour dans l'onglet Classes et encore un clic-droit sur Controller et tu fais Create Files for Controller, tu cliques OK et tu dois voir deux nouveaux fichiers dans Xcode. (jette un oeil sur le source de Controller)

Maintenant, tu peux essayer d'ajouter des objets &#224; ta fen&#234;tre dans IB et essayer d'interagir avec eux (recherche les termes outlets et target-action dans la doc)

Bonne continuation ;)
 
Oui, ça j'ai déjà fait avec Interface Builder, j'ai suivi le tuto d'Apple. Non en fait ce que je veux c'est juste afficher dans la console le point, pas dans une fenêtre. Ca je le ferais plus tard, quand je maîtriserais mieux.
Merci pour l'erreur, c'est vrai que c'est un peu idiot ;-)
J'ai trouver un truc ou, pour l'initialisation il renvoi un type générique id, je trouve ça un peu bizarre mais je vais essayer:
-(id) initWithX: (in)x andY: (in)y
{
if(![super init]) return nil;
self abs = x;
self ord = y;
return self;
}
Je vais tester voir si ça marche.
 
C'est plutôt:

Bloc de code:
    Coord *monPoint= [[Coord alloc] initWithX:10 y:15];
Mais peut-être as-tu corrigé depuis. Et ta méthode init doit effectivement renvoyer un type id (c'est un pointeur générique sur un objet).

D'habitude on écrit plutôt ça (c'est une forme idiomatique, utilise-là systématiquement):

Bloc de code:
- (id)init
{
self = [super init];
if(self)
{
// Init des variables d'instance
}

return self;
}
Dans ton dernier exemple, que vaut self?
 
C'est plutôt:

Bloc de code:
    Coord *monPoint= [[Coord alloc] initWithX:10 y:15];
Mais peut-être as-tu corrigé depuis. Et ta méthode init doit effectivement renvoyer un type id (c'est un pointeur générique sur un objet).

D'habitude on écrit plutôt ça (c'est une forme idiomatique, utilise-là systématiquement):

Bloc de code:
- (id)init
{
self = [super init];
if(self)
{
// Init des variables d'instance
}

return self;
}
Dans ton dernier exemple, que vaut self?
Heu, justement je comprend pas la valeur que renvoit [super init] dans ton code? C'est le init de NSObject du coup qui est appelé? Dit moi dès que je me trompe.
Ensuite je ne comprend pas pourquoi faire if(self)?
Par contre je n'est pas de mac sous la main, faudra attendre la weekend pour testé tout ça. Merci en tout cas.
J'ai chopper Cocoa par la pratique aussi, ça m'aide pas mal.
 
Heu, justement je comprend pas la valeur que renvoit [super init] dans ton code? C'est le init de NSObject du coup qui est appelé?

Oui, exactement. La règle veut qu'une classe qui hérite d'une autre appelle sa méthode d'initialisation, pour initialiser les variables d'instances héritées. Comme il n'existe que l'héritage simple en ObjC, alors [super init] fait l'affaire. Il me semble qu'en C++, on n'est pas obligé de faire ça, mais ça veut dire que c'est fait automatiquement, et ça rendait le déboguage difficile dans mon expérience.


Ensuite je ne comprend pas pourquoi faire if(self)?

La méthode init de NSObject renvoie nil si l'objet n'a pas pu être initialisé.

J'ai chopper Cocoa par la pratique aussi, ça m'aide pas mal.
Très bon bouquin à mon avis. Enfin un livre américain qui va à l'essentiel et qui ne fait pas du remplissage pour atteindre la pagination demandée par l'éditeur...
 
Ok merci, si tu as d'autres référence intéressante n'hésite pas. J'ai le temps de bouquiner avant de voir tomber mon iMac sur le refurb!:(
 
essaye de suivre les conventions tu essayes de creer enfin reecrire la roue

ta classe devrait s'appeler point2D avec bien sur que de l'anglais -> RCF

tu peux regarder les classes point de java et les reproduire, tu melanges des metiers
ce qui n'est pas un fort pour des objets meres :zen:
 
Bonjour,​

Je me permets de répondre au sujet des références de livres : comme référence d'apprentissage j'ai aussi utilisé les livres d'Aaron Hillagass (Cocoa Programming for MAC OSX et Advanced Mac OSX Programming). Le premier livre est vraiment bon selon moi. Cependant, l'arrivée de XCode3 compromet certains exemples de mise en oeuvre de l'application (la création d'une classe type NSObject par exemple s'effectue de manière différente qu'avec XCode2 et je ne trouve pas réellement intuitif la manière dont on doit dorénavant le gérer ... pour plus d'infos voir les docs d'Apple biensûr). Le second livre est aussi très bien cependant il ne s'adresse pas selon moi à des novices, un petit background Unix est bienvenue pour une totale compréhension des concepts. Une lecture en parallèle du fameux "Design Patterns" n'est pas non plus de trop car elle permet de mieux cerner les choix de conception qu'on retrouve dans la programmation Cocoa.​

Bonne journée !​
 
bonjour quelle tq difficulte avec la creation d'interface en obj-c 2, qui me semble bien + objet qu'avant surtout si tu as une experience en java ou cpp

la souplesse de pointer sur des proprietes c'est plutot pas mal? qu 'es-ce qui te gene?


Bloc de code:
@interface MyInterfaceObject : NSObject {
  NSObject *isa;
  NSInteger oid;

}

+ (id)MyInterfaceObjectImplementPtr;
@property (readonly) NSString  *classname;
@property (copy) NSObject *isa;
@property (assign) NSInteger oid;

@end

:zen: