Objective-C, в отличие от иных языков, тип указателя у объектов не имеет особого значения во время исполнения при посылке сообщений и используется лишь во время компиляции. Просто выполните и проверьте:
Вы же не сомневались ;-) Мы бы могли использовать любой тип или вообще id.
Во время исполнения же всю нужную информацию получают у class object, через переменную isa. class object, c типом Class (или просто класс) – это синглтон, и поэтому классы у объектов можно сравнить простым сравнением указателей:
Если собрать всё информацию из class object, то несложно восстановить интерфейсы у объектов во время исполнения.
имя, тип и атрибуты:
const char *property_getAttributes(objc_property_t property);
У Class, Protocol, SEL можно спросить строку со своим именем:
Увы, у Ivar, Method, objc_property_t своих функций нет и, поэтому мне пришлось их написать:
К сожалению, не всю информацию можно получить. При компиляции теряются:
#define, typedef, типы объектов и имена параметров в объявлениях методов.
Тип объектов в стиле: @«NSObject» – это недокументированное свойство objc runtime.
Если вы объявили интерфейс:
, то функции:
вернут соответственно:
Object Inspector
Objective-C Runtime Reference
Objective-C Runtime Programming Guide
NSNumber *string = [[NSString alloc] initWithString: @"hello"];
NSLog(@"%@", string);
Вы же не сомневались ;-) Мы бы могли использовать любой тип или вообще id.
Во время исполнения же всю нужную информацию получают у class object, через переменную isa. class object, c типом Class (или просто класс) – это синглтон, и поэтому классы у объектов можно сравнить простым сравнением указателей:
[object class] == [object2 class];
Если собрать всё информацию из class object, то несложно восстановить интерфейсы у объектов во время исполнения.
Объекты
// класс:
- (Class) class; + (Class) class;
// супекласс:
- (Class) superclass; + (Class) superclass;
// список протоколов:
Protocol ** class_copyProtocolList(Class cls, unsigned int *outCount);
// список переменных:
Ivar * class_copyIvarList(Class cls, unsigned int *outCount);
// список методов:
Method * class_copyMethodList(Class cls, unsigned int *outCount);
// список свойств:
objc_property_t * class_copyPropertyList(Class cls, unsigned int *outCount);
Переменные
// имя:
const char * ivar_getName(Ivar ivar);
// тип:
const char * ivar_getTypeEncoding(Ivar ivar);
Методы
// имя:
SEL method_getName(Method method); // чтобы перевести его в строку используйте
sel_getName(method_getName(method));
// количество параметров:
unsigned method_getNumberOfArguments(Method method);
// тип параметра с номером index:
char * method_copyArgumentType(Method method, unsigned int index);
void method_getArgumentType(Method method, unsigned int index, char *dst, size_t dst_len);
// тип:
char * method_copyReturnType(Method method);
void method_getReturnType(Method method, char *dst, size_t dst_len);
Свойства
имя, тип и атрибуты:
const char *property_getAttributes(objc_property_t property);
Строки из объектов
У Class, Protocol, SEL можно спросить строку со своим именем:
NSString * NSStringFromClass (Class aClass);
SString * NSStringFromProtocol (Protocol *proto);
NSString *NSStringFromSelector (SEL aSelector);
Увы, у Ivar, Method, objc_property_t своих функций нет и, поэтому мне пришлось их написать:
NSString *OIStringFromIvar (Ivar ivar);
NSString *OIStringFromMethod (Method method);
NSString *OIStringFromProperty (objc_property_t property);
К сожалению, не всю информацию можно получить. При компиляции теряются:
#define, typedef, типы объектов и имена параметров в объявлениях методов.
Тип объектов в стиле: @«NSObject» – это недокументированное свойство objc runtime.
Если вы объявили интерфейс:
@interface MyObject : NSObject {
NSNumber *number;
}
- (void) setNumber: (NSNumber *) number;
- (NSNumber *) number;
@end
, то функции:
OIStringFromIvar (ivar);
// - (void) setNumber: (NSNumber *) number;
OIStringFromMethod (method);
// - (NSNumber *) number;
OIStringFromMethod (method);
вернут соответственно:
NSNumber *number
- (void) setNumber: (id) arg1
- (id) arg1
Ссылки
Object Inspector
Objective-C Runtime Reference
Objective-C Runtime Programming Guide