Непризнанной селектор послал к классу
Я изучаю Objective-C и просто пробую какой-то пример кода. Я получаю следующее сообщение об ошибке:
unrecognized selector sent to class
Вот мой код.
Основы.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;
}
Дробь.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
Дробь.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 ответа:
alloc
является методом класса, ноinit
является методом экземпляра. В вашем коде компилятор жалуется, что он не может найти метод класса с именемinit
, который является точным. Чтобы исправить это, вы должны вызватьinit
на экземпляр, который вы получили обратно отalloc
, например:myFraction = [Fraction alloc]; myFraction = [myFraction init];
Но наиболее распространенный шаблон заключается в том, чтобы вложить вызовы следующим образом:
// calls -init on the object returned by +alloc myFraction = [[Fraction alloc] init];
Это также помогает избежать ошибок, которые могут возникнуть при вызове методов для объекта, который был выделен, но еще не был выделен. инициализированный.
В дополнение к тому, что было сказано относительно вложенных
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);