2009-02-27 2 views
0

У меня есть код obj-c, я планирую отправлять сообщения unsupport в плагине. Однако я не могу игнорировать сообщения. Я думал: «(id) вперед: (SEL) селектор: (marg_list) arglist;» разрешит его но оно hasnt. Как я могу запустить это приложение без получения предупреждения и вызова завершения?игнорирование сообщений в объекте C

#import <stdio.h> 
#import <objc/Object.h> 

//------- @interface section ------- 

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

-(void) print; 
-(void) setNumerator: (int) n; 
-(void) setDenominator: (int) d; 
-(id)  forward: (SEL) selector: (marg_list) arglist; 

@end 

//------- @implementation section ------- 


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

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

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

-(id) forward: (SEL) selector: (marg_list) arglist 
{ 
    return nil; 
} 

@end 

//------- program section ------- 


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

    // Create an instance of a Fraction 

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

    // Set fraction to 1/3 

    [myFraction setNumerator: 1]; 
    [myFraction setDenominator: 3]; 

    // Display the fraction using the print method 

    printf ("The value of myFraction is:"); 
    [myFraction print]; 
    printf ("\n"); 
    [myFraction someMsg: 99]; 
    [myFraction free]; 
    printf("end"); 
    return 0; 
} 

ответ

1

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

[myFraction someMsg: 99]; 

вы должны проверить, если myFraction отвечает на someMsg селектор:

if ([myFraction respondsToSelector:@selector(someMsg:)]) { 
    [myFraction someMsg: 99]; 
} 

Метод -respondsToSelector: определяется в NSObject Protocol Reference, поэтому обратите внимание, что ваш MyFraction объект должен наследовать от NSObject, не Object (или реализовать сам протокол NSObject). Конечно, это действительно лучшая практика в любом случае - прямое подклассирование класса Object обычно обескуражено.

+0

Непосредственный объект подкласса больше, чем просто обескуражен ... ничего не происходит на OS X или в GNUStep. NSObject и NSProxy являются объектами уровня корня. Объект также не позволяет нам сохранять/выпускать семантику, поэтому передача их в коллекции на основе NSObject и API не будут работать корректно. –

Смежные вопросы