Непризнанной селектор послал к классу


Я изучаю 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 4

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

Я знаю, что этот ответ был некоторое время назад, поэтому я хотел бы немного обновить его. Если вы используете alloc/init для инициализации вы можете сократить его до просто

[Fraction new]

И это будет эквивалентно.