Нераспознанный селектор отправлен в класс - PullRequest
4 голосов
/ 10 января 2011

Я изучаю 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 голосов
/ 10 января 2011

alloc - метод класса, но init - метод экземпляра. В вашем коде компилятор жалуется, что не может найти метод класса с именем init, который является точным. Чтобы исправить это, вы должны позвонить init на экземпляр, который вы получили обратно от alloc, например:

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

но самый распространенный способ - это вложить вызовы так:

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

Это также помогает избежать ошибок, которые могут возникнуть при вызове методов для объекта, который был выделен, но еще не инициализирован.

4 голосов
/ 10 января 2011

В дополнение к тому, что было сказано о вложенном вызове 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 голосов
/ 03 октября 2014

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

[Fraction new]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...