2011-01-10 21 views
4

Objective-Cを学習していて、サンプルコードを試しています。次のエラーメッセージが表示されます。クラスに送信されたセレクタが認識されない

unrecognized selector sent to class 

ここは私のコードです。

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 

答えて

15

allocは、クラスメソッドであるが、initは、インスタンスメソッドです。あなたのコードでは、コンパイラは正確であるinitというクラスメソッドを見つけることができないと訴えています。これを修正するには、あなたがそうのように、allocから戻って受信インスタンスにinitを呼び出す必要があります:

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

を最も一般的なパターンは、巣に、このような呼び出しです:これも役立ちます

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

割り当てられているがまだ初期化されていないオブジェクトのメソッドを呼び出すことによって発生する可能性のあるエラーを回避します。

+0

ありがとうございます! – redconservatory

4

ネストされたalloc/initコールに加えて、descriptionに関心があります。あなたのFractionクラスの実装では、次のようにメソッドを追加します。

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

を今、あなたはこのようなNSLog文でそれを直接使用することができます。私はこの答えはしばらく前に私がしたかったでした知っている

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

私は、特定のフラクションクラスはObjective-CのBig Nerd Ranchの本であると考えています。だから、おそらく最終的に起こるでしょう。 –

2

少し更新を与える。あなたが初期化するalloc/initを使用している場合、あなただけの

[Fraction new]

にそれを短縮することができ、それは同等になります。

関連する問題