无法识别的选择器发送到类

时间:2011-01-10 01:59:35

标签: objective-c

我正在学习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

3 个答案:

答案 0 :(得分:15)

alloc是一个类方法,但init是一个实例方法。在您的代码中,编译器抱怨它找不到任何名为init的类方法,这是准确的。要解决此问题,您应该从init收到的实例上调用alloc,如下所示:

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

但最常见的模式是嵌套这样的调用:

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

这也可以帮助您避免在已分配但尚未初始化的对象上调用方法时可能发生的错误。

答案 1 :(得分: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);

答案 2 :(得分:2)

我知道这个答案是在一段时间之前所以我想稍微更新一下。如果您使用alloc / init进行初始化,则可以将其缩短为

[Fraction new]

这将是等效的。