Класс в ObjectiveC, кажется, не распознает унаследованные сообщения - PullRequest
0 голосов
/ 07 октября 2010

Я изучаю ObjectiveC с "Программирование в Objective C" Стивена Кочана, и у меня возникли некоторые трудности с примером. Он создает простой класс Fraction, который наследуется от Object. Вот где у меня возникают проблемы, когда я пытаюсь отправлять сообщения, понятные Object вместо Fraction, например init, alloc или free (см. Код ниже):

// Fraction
#import <stdio.h>
#import <objc/Object.h> // base object

// @interface section
@interface Fraction: Object
{
    int numerator;
    int denominator;
}

- (void) print;
- (void) setNumerator: (int) n;
- (void) setDenominator: (int) d;

@end


// @implementation section

@implementation Fraction;

-(void) print
{
    printf(" %i/%i ", numerator, denominator);
}

-(void) setNumerator: (int) n
{
    numerator = n;
}

-(void) setDenominator: (int) d
{
    denominator = d;
}

@end

// Program section

int main( int argc, char *argv[])
{
    Fraction *myFraction;

    // Create Instance of fraction 
    myFraction = [Fraction alloc];
    myFraction = [Fraction init];

    // Set fraction to 1/3
    [myFraction setNumerator: 1];
    [myFraction setDenominator: 3];


    // Display the fraction
    printf("The value of my fraction is: ");
    [myFraction print];
    printf("\n");


    // Destroy the instance
    [myFraction free];


    return 0;
}

Когда я скомпилирую это: gcc fraction.m -o fraction -l objc

Я получаю следующие предупреждения:

fraction.m: In function ‘main’:
fraction.m:47: warning: ‘Fraction’ may not respond to ‘+alloc’
fraction.m:47: warning: (Messages without a matching method signature
fraction.m:47: warning: will be assumed to return ‘id’ and accept
fraction.m:47: warning: ‘...’ as arguments.)
fraction.m:48: warning: ‘Fraction’ may not respond to ‘+init’
fraction.m:62: warning: ‘Fraction’ may not respond to ‘-free’
fernando@McFofo ~/code/learning objective c:: ./fraction 
objc[1678]: Fraction: Does not recognize selector forward::

и программа при запуске жалуется на недопустимую инструкцию ...

Кто-нибудь знает, что происходит?

1 Ответ

1 голос
/ 07 октября 2010

Классы в Какао (самая популярная библиотека Objective-C, они почти синонимичны) имеют тенденцию наследоваться от NSObject, корневого класса Какао. Это задокументировано здесь .

Существует также протокол NSObject , реализованный NSProxy. Он составляет основу поддержки Какао для Распределенных объектов . Тем не менее, мы можем опередить себя с этим!

Я также заметил, что вы пытаетесь сделать следующее:

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

Вы выделяете память для своего объекта, а затем теряете его, перезаписывая указатель другим. Стандартная практика заключается в том, чтобы сделать это в одну строку следующим образом:

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

Если вы должны сделать это в несколько строк, вы должны сделать следующее:

Fraction *myFraction;
myFraction = [Fraction alloc];
myFraction = [myFraction init];
// myFraction is now ready to go!

Я наткнулся на сайт , который ссылается на то, что кажется книгой, которую вы читаете. Примеры, выделенные на сайте, наследуются от NSObject и импортируются <Foundation/NSObject.h>. Есть ли какая-то особая причина, по которой вы отказались от этого и выбрали класс Object, предоставляемый средой выполнения?

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