target-c Производный класс может не отвечать на метод базового класса - PullRequest
1 голос
/ 10 марта 2010

Я был получен из стороннего класса, и когда я пытаюсь вызвать метод в базовом классе, я получаю, что x может не отвечать на предупреждение компилятора y.

Как я могу удалить предупреждение?

Репро:

@interface ThirdPartyBaseClass : NSObject {}
+(id)build;
-(void)doStuff;
@end

@implementation ThirdPartyBaseClass
+(id) build{
    return [[[self alloc] init] autorelease];
}
-(void)doStuff{ 
}
@end

@interface MyDerivedClass : ThirdPartyBaseClass {}
+(id)buildMySelf;
@end

@implementation MyDerivedClass
+(id)buildMySelf{
    self = [ThirdPartyBaseClass build];
    [self doStuff]; // compiler warning here - 'MyDerivedClass' may not respond to '+doStuff'
return self;
}
@end

Спасибо!

Ответы [ 3 ]

4 голосов
/ 10 марта 2010

В методе класса (которому предшествует «+») «self» не является экземпляром класса; 'self' - это объект Class, который отвечает только на методы Class, а не на методы экземпляра. Если вы создаете экземпляр, чтобы вы могли вызвать на нем doStuff и вернуть его, вам нужно будет использовать отдельную переменную:

+ (id) buildMySelf
{
   MyDerivedClass *myDerivedClassInstance;

   myDerivedClassInstance = [self build];
   [myDerivedClassInstance doStuff];

   return myDerivedClassInstance;
}
1 голос
/ 10 марта 2010

-(void)doStuff - это метод экземпляра, но вы вызываете его для того, что компилятор считает классом. Компилятор считает, что self указывается как класс, а не как ThirdPartyBaseClass объект

Попробуйте

@implementation MyDerivedClass
+(id)buildMySelf{
    id other = [ThirdPartyBaseClass build];
    [other doStuff];
    return other;
}
@end
0 голосов
/ 10 марта 2010

Вы пытались изменить buildMySelf на:

+(id)buildMySelf{
      self = [MyDerivedClass build];
      [self doStuff];
      return self;
}

Использование [ThirdPartyBaseClass build]; создает экземпляр ThirdPartyBaseClass, а не MyDerivedClass.

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