# Débuter en Objective-C



## greensource (5 Octobre 2007)

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


----------



## clampin (5 Octobre 2007)

Tu dois choisir comme projet "Foundation Tool"....


----------



## Eul Mulot (5 Octobre 2007)

Des infos utiles ici, le site est blindé de ressources et l'API dispose de moults exemples et cas d'utilisation.

http://developer.apple.com/documentation/Cocoa/ObjectiveCLanguage-date.html


----------



## greensource (4 Novembre 2007)

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


Et l'interfacce qui va avec:


> #import <Cocoa/Cocoa.h>
> @interface Coord : NSObject {
> int abs;
> int ord;
> ...


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[])
> {
> ...


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 )_


----------



## mpergand (4 Novembre 2007)

Salut,

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

Ya quelques erreurs grossi&#232;res:

```
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


----------



## greensource (4 Novembre 2007)

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


Je vais tester voir si ça marche.


----------



## Céroce (5 Novembre 2007)

C'est plutôt:


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


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

return self;
}
```
Dans ton dernier exemple, que vaut self?


----------



## greensource (6 Novembre 2007)

Céroce a dit:


> C'est plutôt:
> 
> 
> ```
> ...


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.


----------



## Céroce (7 Novembre 2007)

greensource a dit:


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




greensource a dit:


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



greensource a dit:


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


----------



## greensource (7 Novembre 2007)

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!


----------



## tatouille (7 Novembre 2007)

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


----------



## galyathee (12 Novembre 2007)

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 !​


----------



## tatouille (12 Novembre 2007)

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?



```
@interface MyInterfaceObject : NSObject {
  NSObject *isa;
  NSInteger oid;

}

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

@end
```


----------

