livre sur ObjC

Le
unbewust
je recherche un "bon" bouquin sur ObjC.

je cherche moins à développer de l'ObjC/Cocoa que de l'ObjC à ajouter
dans des extensions C pour Ruby.

cependant s'il y a du cocoa dans le bouquin, en partie mineure, c'est
OK

Yvon
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
luc
Le #495649
unbewust
je cherche moins à développer de l'ObjC/Cocoa que de l'ObjC à ajouter
dans des extensions C pour Ruby.


Je ne vois pas ce qu'un livre sur ObjC, le langage, t'apporterait de
concret sur l'art et la manière d'en incorporer dans une extension Ruby,
ce qui est un cas particulier d'une part, qui se trouve être totalement
trivial d'autre part.

--
Luc Heinrich

unbewust
Le #495648
On 15 août, 17:03, (Luc Heinrich) wrote:
unbewust
je cherche moins à développer de l'ObjC/Cocoa que de l'ObjC à ajo uter
dans des extensions C pour Ruby.


Je ne vois pas ce qu'un livre sur ObjC, le langage, t'apporterait de
concret sur l'art et la manière d'en incorporer dans une extension Ruby,
ce qui est un cas particulier d'une part, qui se trouve être totalement
trivial d'autre part.

--
Luc Heinrich



bah si c'est trivial alors....

sous les conseils de Bourguignon j'ai fait un petit test que j'arrive
à compiler "à la main" : une première passe sur l'ObjC puis après
j'utilise extconf.rb/mkmf et ça roule.

la première passe en ObjC ne génère pas les liens, si je vérifie (a vec
otool) j'ai les bons symboles.


mais je ne vois pas ce qu'il faut passer comme id obj depuis C à la
méthode ObjC, donc j'ai mis NULL l'essai :

Testing "RObjCC"
+--------------+
version() = MyRObjC version 0.0.1
cinData = 1
in "MyObj_myMethod" a = 1
coutData = 0 // ????
ragnagna(1) = 0

appel depuis C :

int cinData = FIX2INT ( inData );
printf ( "cinData = %dn", cinData );
int coutData = MyObj_myMethod ( NULL, cinData );
printf ( "coutData = %dn", coutData );


MyObj.m :
+-------+
#import "MyObj.h"

@implementation MyObj

- myMethod:(int)a
{
printf("in "%s" a = %dn", __func__, a);
return [self ragnagna:(a+1)];
}

@end

id MyObj_myMethod(id obj,int a)
{
printf("in "%s" a = %dn", __func__, a);
return [obj myMethod:a];
}


DONC myMethod n'est pas appellée depuis quand id obj == NULL côté C
+-----------------------------------------------------------------+

MAIS MyObj_myMethod est bien appellée cf. :
in "MyObj_myMethod" a = 1

si tu vois où ça déconne...


luc
Le #495646
unbewust
sous les conseils de Bourguignon j'ai fait un petit test que j'arrive
à compiler "à la main" : une première passe sur l'ObjC puis après
j'utilise extconf.rb/mkmf et ça roule.


Je vois que tu aimes toujours autant les methodes les plus compliquées
possible... :)

mais je ne vois pas ce qu'il faut passer comme id obj depuis C à la
méthode ObjC, donc j'ai mis NULL l'essai :


Cet exemple ne montre rien et n'explique rien à ton problème.

Soit tu as des problème de compilation/link de l'extension auquel cas il
faut le dire, soit tu as des problème de compréhension de base
d'Objective-C auquel cas il faut le dire aussi.

Une méthode d'instance (déclarée avec '-') s'appelle sur une instance
allouée et initialisée (alloc+init). Comment veut tu que ta méthode soit
appelée si l'instance que tu utilises est NULL ?!?

--
Luc Heinrich

unbewust
Le #495387
On 15 août, 20:43, (Luc Heinrich) wrote:
unbewust
sous les conseils de Bourguignon j'ai fait un petit test que j'arrive
à compiler "à la main" : une première passe sur l'ObjC puis apr ès
j'utilise extconf.rb/mkmf et ça roule.


Je vois que tu aimes toujours autant les methodes les plus compliquées
possible... :)


je ne suis pas parvenu, pour l'instant, à tout faire par extconf,
peut-être suffit'il d'ajouter l'option -ObjC ???

en tout cas, pour l'instant je ne suis pas parvenu à compiler des
sources .c et .m simultanément, ça devrait-être possible car gcc tient
compte de l'extension pour la compilation...

mais je ne vois pas ce qu'il faut passer comme id obj depuis C à la
méthode ObjC, donc j'ai mis NULL l'essai :


Cet exemple ne montre rien et n'explique rien à ton problème.

Soit tu as des problème de compilation/link de l'extension auquel cas il
faut le dire,


non, le link se passe bien puisque je peux faire un printf à partir
d'une méthode ObjC.

soit tu as des problème de compréhension de base
d'Objective-C auquel cas il faut le dire aussi.


c'est sûr que mon pb est là...

Une méthode d'instance (déclarée avec '-') s'appelle sur une instan ce
allouée et initialisée (alloc+init). Comment veut tu que ta méthode soit
appelée si l'instance que tu utilises est NULL ?!?


c'est ce que j'ai compris +/- confusément, comment depuis C créer une
instance d'un objet Objc.

ou bien alors c'est la méthode :
id MyObj_myMethod(id obj,int a)
{
printf("in "%s" a = %dn", __func__, a);
return [obj myMethod:a];

}

qui est mal écrite, elle devrait elle même s'occuper d'alloc + init du
genre (en raccourci :

id MyObj_myMethod( int a)
{
printf("in "%s" a = %dn", __func__, a);
alloc init de obj
return [obj myMethod:a];

}

donc + d'objet à passer de C à ObjC, j'utilise "MyObj_myMethod" comme
une fonction...
--
Luc Heinrich



unbewust
Le #495386
On 15 août, 20:43, (Luc Heinrich) wrote:


bon voila ce que j'ai fait et qui roule en une seule passe de compil :

MyObj.h :
+-------+
#import
@interface MyObj : NSObject
{
@protected
int a;
}
- initWithA: (int) a;
- ( void ) setA : ( int ) newA;
- ( int ) aPlusUn;
@end

int MyObj_myMethod ( int a );

MyObj.m :
+-------+
#import "MyObj.h"

@implementation MyObj : NSObject

- initWithA: ( int ) newA
{
self = [ super init ];
if(self) {
[ self setA: newA ];
}
return self;
}
- ( void ) setA : ( int ) newA
{
a = newA;
}
- ( int ) aPlusUn
{
return a + 1;
}
- (void) dealloc {
//[ a release ];
[ super dealloc ];
}

@end

int MyObj_myMethod( int newA )
{
MyObj *myObj = [ [MyObj alloc] initWithA: newA ];
return [ myObj aPlusUn ];
}

MyRObCj.c : ( la *pseudo* C ext to Ruby using ObjC )
+---------+
#include #include #include "ruby.h"

VALUE cMyRObjC;

/*
* Returns the version of this module
*/
VALUE m_roc_version ( VALUE self )
{
char *version = "MyRObjC version 0.0.1";
return rb_str_new2 ( version );
}

/*
* Returns inData + 1
*/
VALUE m_a_plus_un ( VALUE self, VALUE inData )
{
int cinData = FIX2INT ( inData );
int coutData = MyObj_myMethod ( cinData );
return INT2FIX ( coutData );
}

void Init_myrobjc ()
{
cMyRObjC = rb_define_module ( "MyRObjC" );
rb_define_module_function ( cMyRObjC, "version", m_roc_version, 0 );
rb_define_module_function ( cMyRObjC, "plus_un", m_a_plus_un, 1 );
}

sample.rb : ( le test basic )
+---------+
require 'myrobjc'
include MyRObjC

puts "Testing "RObjCC""
puts "+--------------+"
puts "version() = " + version()
# => version() = MyRObjC version 0.0.1
puts "plus_un(1) = " + plus_un( 1 ).to_s
# => plus_un(1) = 2


j'arrive donc à faire 1 + 1 donne 2 ;-)
luc
Le #495385
unbewust
c'est ce que j'ai compris +/- confusément, comment depuis C créer une
instance d'un objet Objc.


Pourquoi "depuis C" ? Encore une fois, dans "Objective-C", il y a "C" et
mixer les deux ne pose strictement aucun problème.

ou bien alors c'est la méthode :
...
qui est mal écrite, elle devrait elle même s'occuper d'alloc + init


Un obj doit être instancié, ça c'est certain.


--
Luc Heinrich

unbewust
Le #495382
On 16 août, 13:47, (Luc Heinrich) wrote:
unbewust
c'est ce que j'ai compris +/- confusément, comment depuis C créer u ne
instance d'un objet Objc.


Pourquoi "depuis C" ? Encore une fois, dans "Objective-C", il y a "C" et
mixer les deux ne pose strictement aucun problème.



NON, non, effectivement, j'instancie l'objet depuis ObjC, c'est même
quasiment obligatoire pour deallouer...

ou bien alors c'est la méthode :
...
qui est mal écrite, elle devrait elle même s'occuper d'alloc + init


Un obj doit être instancié, ça c'est certain.



OK, merci, je lirai cela attentivement...

Yvon


Publicité
Poster une réponse
Anonyme