Уверен, вы не понимаете, что такое интерфейс в Objective-C.Интерфейс - это просто объявление типа данных и методов класса.Протокол Objective-C, аналогичный Java-интерфейсам, - это протокол.
«Конечно, я мог бы пропустить класс…». Вы только что ответили на свой вопрос.Потому что интерфейс создает его класс!Итак,
- (void)doSomethingWithClass:(Class)aClass {
NSLog(@"class == %@", aClass);
}
Передайте что-нибудь в это, используя
[obj doSomethingWithClass:[obj class]];
Если вы действительно хотели сказать, что хотите передавать протоколы, вот что вы делаете.Предполагая, что у вас есть протокол, который выглядит как
@protocol Foldable <NSObject>
+ (id <Foldable>)unit;
- (id <Foldable>)append:(id <Foldable>)object;
@end
Затем вы можете делать с ним что-то вроде этого:
- (void)doSomethingWithProtocol:(Protocol *)aProtocol {
NSLog(@"protocol == %s", protocol_getName(aProtocol));
}
Протокол можно передать в этот метод следующим образом:
[obj doSomethingWithProtocol:@protocol(Foldable)];
Как видите, в то время как вы передаете классы, отправляя +class
идентификатору типа Objective-C, вы передаете протоколы, используя директиву @protocol()
.
Редактировать: Дополнительная информация
Для ясности, интерфейс - это просто инструкция для компилятора.Вы не можете пойти и "захватить" интерфейс и сделать что-то с ним.Но интерфейс вызывает несколько вещей:
- Он вызывает создание структуры внутри вашей скомпилированной программы;в этой структуре есть переменные экземпляра вашего класса, а также переменные его суперклассов.
- Это заставляет имя типа, связанное с этой структурой, принимать сообщения Objective-C (например,
+class
или любые другие).метод класса, определенный на нем);на самом деле он указывает на объект метакласса.
Теперь вторая точка зрения может показаться запутанной, но это также довольно интересно.Вам сказали, что классы являются объектами в Objective-C, что в основном правильно.Но это может привести вас к удивлению, почему следующее невозможно:
[self doSomethingWithClass:NSObject];
Причина, по которой вы не можете сделать это, та же самая причина, по которой вы не можете ожидать, что что-то подобное будет работать:
[self doSomethingWithType:int];
Поскольку оказывается, что идентификаторы классов (например, NSObject
) на самом деле являются просто именами структурных типов, но с изюминкой: они также могут получать сообщения.Следовательно, если вы используете класс Objective C в качестве параметра шаблона в C ++, вы действительно можете отправлять ему сообщения!
template <typename T>
void something_crazy() {
NSLog(@"object: %@", [[T new] autorelease]);
}
something_crazy<NSArray>();
Так что это действительно многословный способ ответить на ваш последний вопрос, какой типинтерфейс становится после компиляции.Интерфейс не как таковой не становится ничем или в любое время после компиляции, но вызывает генерацию специального типа pimped структуры, которая принимает сообщения, действующие как метакласс.