2011-01-10 11 views
4
gesendet

Ich lerne Objective-C und probiere nur einen Beispielcode aus. Ich erhalte die folgende Fehlermeldung:Unbekannter Selektor an Klasse

Hier ist mein Code.

Basics.m

#import <Foundation/Foundation.h> 
#import "Fraction.h" 

int main (int argc, char *argv[]) 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    Fraction *myFraction; 

    // Create an instance of a Fraction 

    myFraction = [Fraction alloc]; 
    myFraction = [Fraction init]; 

    // set Fraction to 1/3 
    [myFraction setNumerator: 1]; 
    [myFraction setDenominator: 3]; 

    // Display the value using the print method 
    NSLog(@"The value of myFraction is:"); 
    [myFraction print]; 
    [myFraction release]; 

    [pool drain]; 
    return 0; 
} 

Fraction.h

#import <Foundation/Foundation.h> 

// -- interface section --// 
@interface Fraction : NSObject { 
    int numerator; 
    int denominator; 
} 

// public method signatures 
-(void) print; 
-(void) setNumerator: (int) n; 
-(void) setDenominator: (int) d; 
@end 

Fraction.m

//--implementation section --// 
@implementation Fraction 
-(void) print 
{ 
    NSLog(@"%i/%i",numerator,denominator); 
} 
-(void) setNumerator: (int) n 
{ 
    numerator = n; 
} 
-(void) setDenominator: (int) d 
{ 
    denominator = d; 
} 
@end 

Antwort

15

alloc ist eine Klassenmethode, aber init ist eine Instanzmethode. In Ihrem Code beschwert sich der Compiler, dass es keine Klassenmethode mit dem Namen init finden kann, die korrekt ist. Um dies zu korrigieren, sollten Sie init auf die Instanz rufen Sie zurück von alloc erhalten, etwa so:

myFraction = [Fraction alloc]; 
myFraction = [myFraction init]; 

aber die häufigste Muster ist zu nisten die Anrufe wie folgt aus:

// calls -init on the object returned by +alloc 
myFraction = [[Fraction alloc] init]; 

Dies hilft auch, Sie vermeiden Fehler, die auftreten können, wenn Methoden für ein Objekt aufgerufen werden, das zwar zugeordnet, aber noch nicht initialisiert wurde.

+0

Das funktioniert, danke! – redconservatory

4

Zusätzlich zu dem, was in Bezug auf die verschachtelte alloc/init Aufruf, etwas, das Sie interessiert sein könnte, ist description. In Ihrer Fraction Klassenimplementierung, fügen Sie eine Methode wie folgt:

- (NSString *) description 
{ 
    return [NSString stringWithFormat:@"%i/%i", numerator, denominator]; 
} 

Jetzt können Sie es in NSLog Aussagen wie diese direkt verwenden:

// set Fraction to 1/3 
[myFraction setNumerator: 1]; 
[myFraction setDenominator: 3]; 

// Display the value using the print method 
NSLog(@"The value of myFraction is: %@", myFraction); 
+0

Ich glaube, dass die spezifische Fraction-Klasse aus einem Big Nerd Ranch-Buch über Objective-C stammt, also wird es wahrscheinlich irgendwann kommen. –

2

ich diese Antwort wissen, vor einer Weile war so wollte ich gib ein kleines Update. Wenn Sie alloc/init verwenden zu initialisieren können Sie es verkürzen nur

[Fraction new]

und gleichwertig sein.

Verwandte Themen