2016-06-24 2 views
1

J'ai le code suivant dans l'objectif-c, avec un avertissement. Les articles que j'ai examinés à ce sujet semblent indiquer que ce n'est pas un énorme problème; c'est une méthode qui est créée automatiquement. Dans mon cas, cependant, ne donne pas le résultat si le devrait. Je ne suis pas sûr de ce que je fais mal. Étant donné que c'est l'un des premiers programmes de l'objectif-C que je suis en train de faire, j'aime le valider pour que je puisse me familiariser avec la bonne syntaxe. Voici le code:objectif C nouvelle méthode non définie peut être le problème

#import <stdio.h> 
#import <objc/Object.h> 
//---------------interface section------------- 

@interface Fraction: Object 
{ 
    int numerator; 
    int denominator; 
} 
-(void) setNumerator: (int) n; 
-(void) setDenominator: (int) d; 
-(void) print; 
@end 
//-----------------implementation section------- 
@implementation Fraction; 
//getters 
-(int) numerator 
{ 
    return numerator; 
} 
-(int) denominator 
{ 
    return denominator; 
} 
//setters 
-(void) setNumerator: (int) num 
{ 
    numerator = num; 
} 
-(void) setDenominator: (int) denom 
{ 
    denominator = denom; 
} 
-(void) print 
{ 
    printf("The value of the fraction is %i/%i\n", numerator, denominator); 
} 
@end 
//-----------------program section------------------------- 
int main (void) 
{ 
    Fraction *myFract; 
    myFract = [Fraction new]; 
    [myFract setNumerator: 1]; 
    [myFract setDenominator: 3]; 

    printf ("The numerator is %i, and the denominator is %i\n", [myFract numerator], [myFract denominator]); 
    [myFract print]; 
    [myFract free]; 
    return 0; 
} 

Voici le message d'avertissement:

$ gcc -o fraction fraction.m -I /GNUstep/System/Library/Headers -L /GNUstep/System/Library/Libraries -lobjc -lgnustep-b 
ase -fconstant-string-class=NSConstantString 
fraction.m: In function 'main': 
fraction.m:43:3: warning: 'Fraction' may not respond to '+new' [enabled by default] 
fraction.m:43:3: warning: (Messages without a matching method signature [enabled by default] 
fraction.m:43:3: warning: will be assumed to return 'id' and accept [enabled by default] 
fraction.m:43:3: warning: '...' as arguments.) [enabled by default] 
fraction.m:49:3: warning: 'Fraction' may not respond to '-free' [enabled by default] 

Voici la sortie:

$ ./fraction.exe 
The numerator is 0, and the denominator is 0 

Je ne sais pas si elle est pertinente, mais je me sers GNUstep pour compilez-le. Je ne connais pas de moyen d'exécuter le débogage dessus. J'ai essayé GDB mais ça n'a pas marché. En passant, ai-je besoin d'un environnement Mac, si je veux profiter pleinement des avantages de cette langue? Existe-t-il des applications non-Mac/Apple de cette langue?

+0

Il existe * quelques * applications non Apple-environnement qui sont écrites en Objective-C, mais il est très considéré comme une technologie Apple. Le compilateur Apple est l'étalon-or de ce qu'est la définition d'Objective-C. –

+0

Y at-il un moyen d'apprendre un peu les bibliothèques sans avoir à acheter une machine Apple? J'aime le produit Je ne veux juste pas dépenser l'argent pour le moment. – maverick

+0

Les nouveaux Macs sont assez chers, mais vous pourriez être en mesure de trouver un Mac utilisé assez bon marché. Si vous voulez juste apprendre Objective-C, alors tout Mac qui peut exécuter OS X devrait le faire. Il est possible d'exécuter OS X sur du matériel non-Apple, bien que cela soit une violation de l'accord de licence de logiciel d'Apple. Informations sur la façon de créer un "Hackintosh" est facilement disponible sur Internet. –

Répondre

1

Object est une classe racine obsolète. Utilisez NSObject à la place. N'appelez pas free. Si vous utilisez la gestion manuelle de la mémoire, utilisez release. Si vous utilisez ARC, n'appelez rien.

new ne doit pas être pris en charge par GNUstep, vous devez donc utiliser le modèle de classe alloc et init.

@interface Fraction: NSObject 
{ 
    int numerator; 
    int denominator; 
} 
-(void) setNumerator: (int) n; 
-(void) setDenominator: (int) d; 
-(void) print; 
@end 
//-----------------implementation section------- 
@implementation Fraction; 
//getters 
-(int) numerator 
{ 
    return numerator; 
} 
-(int) denominator 
{ 
    return denominator; 
} 
//setters 
-(void) setNumerator: (int) num 
{ 
    numerator = num; 
} 
-(void) setDenominator: (int) denom 
{ 
    denominator = denom; 
} 
-(void) print 
{ 
    printf("The value of the fraction is %i/%i\n", numerator, denominator); 
} 
@end 
//-----------------program section------------------------- 
int main (void) 
{ 
    Fraction *myFract = [[Fraction alloc] init]; 
    [myFract setNumerator: 1]; 
    [myFract setDenominator: 3]; 

    printf ("The numerator is %i, and the denominator is %i\n", [myFract numerator], [myFract denominator]); 
    [myFract print]; 
    [myFract release]; 
    return 0; 
} 

Vous pouvez également simplifier avec les propriétés, ce qui suit est la syntaxe Obj-C 2.0 avec le comptage automatique des références.

@interface Fraction: NSObject 

@property (nonatomic, assign) int numerator; 
@property (nonatomic, assign) int denominator; 

- (void)print; 

@end 

@implementation Fraction 
- (void)print { 
    printf("The value of the fraction is %i/%i\n", self.numerator, self.denominator); 
} 
@end 

int main (void) 
{ 
    Fraction *myFract = [[Fraction alloc] init]; 
    myFract.numerator = 1; 
    myFract.denominator = 3; 

    printf ("The numerator is %i, and the denominator is %i\n", [myFract numerator], [myFract denominator]); 
    [myFract print]; 
    return 0; 
} 

Même avec GNUstep, vous devriez utiliser Clang pour la compilation. GCC n'en fera tout simplement plus.

+0

Je ne pense pas que GNUstep supporte ARC, bien qu'à un moment donné, ils aient supporté la récupération de place mark/sweep. –

+0

@MarkBessey Il fait mais avec Clang, voir http://wiki.gnustep.org/index.php/ObjC2_FAQ – Sulthan

+0

Oh, cool. Cela fait longtemps que j'ai essayé de faire quelque chose avec GNUstep. –