2012-07-01 4 views
0

Предположим, что у меня есть определенный класс объекта, который определяет метод класса возвращения простую информацию о том, что класс, таким образом:Вызов метода класса на потенциально неизвестного класса (IOS)

+ (NSInteger) defaultValueForClass { 
    return 5; 
} 

Теперь представьте, что у меня есть серия подклассов, каждая из которых переопределяет этот метод для предоставления различной информации. Мой вопрос заключается в следующем: как я могу вызвать этот метод класса, не зная, какой конкретный подкласс выполняется, таким образом, что используется соответствующий метод подкласса? Я не могу просто пойти:

[[anObject class] defaultValueForClass] 

... потому что компилятор на данный момент не знает о моем пользовательском подклассе.

+0

он будет знать тип класса во время выполнения –

+0

Речь идет не о том, что он знает во время выполнения, а в том, чтобы заставить компилятор понять, что этот код действителен, чтобы проект скомпилировался в первую очередь. – Ash

ответ

0

К сожалению о моем предыдущем посте, я был неправ, просто определить протокол, а затем, если ваш класс conformsToProtocol проверить, или проверить, если данный класс «isSubclassOfClass»

+0

Это, похоже, устранило проблему, хотя кажется, что исходная ошибка, которую я получал, была на самом деле какой-то ошибкой с Xcode. Это как если бы ... это будет звучать странно, но ... он не будет распознавать имя класса до тех пор, пока класс не будет скомпилирован, но сам проект НИКОГДА не будет компилироваться, потому что имя класса не было распознано. Удалив вызов [class classMethod] и построения, компилятор распознал метод. Замена кода выполнялась с помощью только беглых предупреждений, которые были очищены путем добавления вашего протокола. – Ash

0

работает для меня.

// car.m 
#import <Foundation/Foundation.h> 

@interface Car : NSObject 
+ (void)make; 
@end 

@interface Honda : Car 
@end 

@interface Porsche : Car 
@end 

@implementation Car 
+ (void)make { NSLog(@"generic"); } 
@end 

@implementation Honda 
+ (void)make { NSLog(@"Honda"); } 
@end 

@implementation Porsche 
+ (void)make { NSLog(@"Porsche"); } 
@end 

int main() { 
    Porsche *porsche = [[Porsche alloc] init]; 
    [[porsche class] make]; 

    Car *supercar = (Car *)[[Honda alloc] init]; 
    [[supercar class] make]; 

    return 0; 
} 

И в результате компиляции и выполнения отсутствуют ошибки или предупреждения.

 
$ clang -framework foundation car.m -o car.o 
$ ./car.o 
2012-07-01 01:53:46.559 car.o[8127:707] Porsche 
2012-07-01 01:53:46.561 car.o[8127:707] Honda 

Какую версию Xcode и GCC вы используете? Это старый GCC или LLVM-GCC?

+0

XCode 4.3 Вы знаете, самое странное, я переписал код точно так же, как я его впервые реализовал, и он начал давать совершенно другое предупреждение! Это сразу выяснилось, когда я применил предложение Moxy о создании протокола. – Ash

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