未识别的选择器发送到类

5
我正在学习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个回答

15

alloc 是一个类方法,而 init 是一个实例方法。在你的代码中,编译器报错是因为找不到任何叫做 init 的类方法,这是准确的。要纠正这个问题,你应该在从 alloc 接收到的实例上调用 init,像这样:

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

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

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

这也有助于避免在调用未初始化的对象方法时可能发生的错误。


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);

我相信这个特定的分数类是来自于一本关于Objective-C的Big Nerd Ranch书籍,所以这可能最终会出现。 - Justin Spahr-Summers

2

我知道这个答案是一段时间之前给出的,所以我想提供一点更新。如果您正在使用alloc/init进行初始化,您可以缩短代码:

[Fraction new]

这将是等效的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接