我正在学习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
答案 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]
这将是等效的。