Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

livre sur ObjC

7 réponses
Avatar
unbewust
je recherche un "bon" bouquin sur ObjC.

je cherche moins =E0 d=E9velopper de l'ObjC/Cocoa que de l'ObjC =E0 ajouter
dans des extensions C pour Ruby.

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

Yvon

7 réponses

Avatar
luc
unbewust wrote:

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

Avatar
unbewust
On 15 août, 17:03, (Luc Heinrich) wrote:
unbewust wrote:
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...


Avatar
luc
unbewust wrote:

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

Avatar
unbewust
On 15 août, 20:43, (Luc Heinrich) wrote:
unbewust wrote:
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



Avatar
unbewust
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 <Foundation/Foundation.h>

@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 <stdio.h>
#include <string.h>
#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 ;-)
Avatar
luc
unbewust wrote:

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.

<http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/>

--
Luc Heinrich

Avatar
unbewust
On 16 août, 13:47, (Luc Heinrich) wrote:
unbewust wrote:
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.

<http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/>


OK, merci, je lirai cela attentivement...

Yvon