Поскольку свойство с именем «возраст» всегда будет иметь селектор с именем «возраст», я мог бы использовать respondsToSelector
как этот вопрос предлагает, и это скажет мне, существует ли конкретный селектор во время выполнения в любом данном объекте.
Если свойство с именем «возраст» существует, я могу это проверить. Как я могу узнать, возвращает ли этот селектор (метод чтения для этого свойства) объект (id) или не объект (int)?
Возможно ли такое определение типа во время выполнения, или цель-C всегда предполагает, что кто-то реализовал этот метод, используя тип, который, как я надеюсь, он использовал, или я также могу проверить возвращаемый тип?
Это использует последнюю версию Objective-C (LLVM 4.1) в XCode 4.5.
Обновление: это категория утилит на NSObject, которую я придумал:
- (NSString*) propertyType: (NSString*)propname
{
objc_property_t aproperty = class_getProperty([self class], [propname cStringUsingEncoding:NSASCIIStringEncoding] ); // how to get a specific one by name.
if (aproperty)
{
char * property_type_attribute = property_copyAttributeValue(aproperty, "T");
NSString *result = [NSString stringWithUTF8String:property_type_attribute];
free(property_type_attribute);
return result;
}
else
return nil;
}
Изучая этот вопрос, я также написал этот удобный служебный метод, который может перечислить все свойства этого объекта:
- (NSArray*) properties;
{
NSMutableArray *results = [NSMutableArray array];
@autoreleasepool {
unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList([self class], &outCount);
for (i = 0; i < outCount; i++) {
objc_property_t property = properties[i];
const char * aname=property_getName(property);
[results addObject:[NSString stringWithUTF8String:aname]];
//const char * attr= property_getAttributes(property);
//[results addObject:[NSString stringWithUTF8String:attr]];
}
if (properties) {
free(properties);
}
} // end of autorelease pool.
return results;
}