2

「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;
}
4

2 に答える 2

3

class_copyPropertyListクラスで宣言されたプロパティのリストを取得するために使用できます。

class_copyPropertyList

クラスによって宣言されたプロパティについて説明します。

そしてproperty_getAttributes

property_getAttributes

プロパティの属性文字列を返します。

ここでは、より具体的なヒントと例をいくつか見つけることができます。

補足として、次のステートメント:

「age」という名前のプロパティには常に「age」という名前のセレクターがあるため、

プロパティはカスタムゲッターやセッターを持つことができるため、不正解です:

@property (nonatomic, getter=isImmediate) BOOL immediate;

編集:

別のSO投稿で見つけたサンプルコード:

const char * type = property_getAttributes(class_getProperty([self class], "myPropertyName"));
NSString * typeString = [NSString stringWithUTF8String:type];
NSArray * attributes = [typeString components separatedByString:@","];
NSString * typeAttribute = [attributes objectAtIndex:0];
NSString * propertyType = [typeAttribute substringFromIndex:1];
const char * rawPropertyType = [propertyType UTF8String];

if (strcmp(rawPropertyType, @encode(float)) == 0) {
 //it's a float
} else if (strcmp(rawPropertyType, @encode(int)) == 0) {
 //it's an int
} else if (strcmp(rawPropertyType, @encode(id)) == 0) {
 //it's some sort of object
} else ....
于 2013-01-14T21:21:06.543 に答える
2

プロパティ名が既にわかっている場合にとれる 1 つの方法は、class_getProperty関数を使用することです。関数を使用してproperty_copyAttributeValue()、特定の属性だけを名前で取得することもできます。

objc_property_t number_property = class_getProperty([MyClass class], "number");
char *number_property_type_attribute = property_copyAttributeValue(number_property, "T");
NSLog(@"number property type attribute = %s", number_property_type_attribute);

ログに記録します:

2013-01-14 14:45:37.382 RuntimeFun[61304:c07] 数値プロパティ タイプ属性 = i

MyClass次のようなものと仮定します。

@interface MyClass : NSObject
@property (nonatomic) int number;
@end

@implementation MyClass
@end

型属性文字列を取得したら、それをさまざまなObjective-C 型エンコーディングと比較できます。比較が完了したら、必ずfree()属性文字列を呼び出してください。

于 2013-01-14T22:01:53.310 に答える