「age」という名前のプロパティには常に「age」という名前のセレクターがあるためrespondsToSelector
、この質問が示唆するように使用できます。これにより、実行時に特定のセレクターが特定のオブジェクトに存在するかどうかがわかります。
「年齢」という名前のプロパティが存在する場合、それを確認できます。そのセレクター (そのプロパティの読み取りメソッド) がオブジェクト (id) または非オブジェクト (int) を返すかどうかを知るにはどうすればよいですか?
そのような型の決定は実行時に可能ですか、それとも目的の C の方法では、誰かがそのメソッドを使用したいと思っている型を使用してそのメソッドを実装したと常に想定していますか、それとも戻り値の型を確認できますか?
これは、XCode 4.5 で最新の Objective-C バージョン (LLVM 4.1) を使用しています。
更新: これは、私が思いついた utility-category-on-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;
}