1. ホーム
  2. objective-c

[解決済み] Objective-Cでオブジェクトのプロパティリストを取得する

2022-10-22 21:02:25

質問

どうすればリスト( NSArray または NSDictionary ) のようなオブジェクトのプロパティは、Objective-Cではどうなるのでしょうか?

次のシナリオを想像してください。 NSObject を継承した親クラスを定義し、その親クラスが NSString , a BOOLNSData オブジェクトをプロパティとして持っています。そして、この親クラスを拡張するいくつかのクラスがあり、それぞれ多くの異なるプロパティを追加しています。

のインスタンスメソッドを実装する方法はないでしょうか? クラスのインスタンスメソッドを実装する方法はありますか?このメソッドはオブジェクト全体を通過して、例えば NSArray として、それぞれの (子) クラスのプロパティを NSStrings であることを ではない を親クラスで使用することで、後でこれらの NSString をKVCに使用できますか?

どのように解決するのですか?

私はちょうど自分自身で答えを得ることに成功しました。Obj-C ランタイム ライブラリを使用することで、私が望む方法でプロパティにアクセスすることができました。

- (void)myMethod {
    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 *propName = property_getName(property);
        if(propName) {
            const char *propType = getPropertyType(property);
            NSString *propertyName = [NSString stringWithCString:propName
                                                                encoding:[NSString defaultCStringEncoding]];
            NSString *propertyType = [NSString stringWithCString:propType
                                                                encoding:[NSString defaultCStringEncoding]];
            ...
        }
    }
    free(properties);
}

これは主にAppleのコードサンプル(正確なソースは今思い出せません)から引用したものです。

static const char *getPropertyType(objc_property_t property) {
    const char *attributes = property_getAttributes(property);
    char buffer[1 + strlen(attributes)];
    strcpy(buffer, attributes);
    char *state = buffer, *attribute;
    while ((attribute = strsep(&state, ",")) != NULL) {
        if (attribute[0] == 'T') {
            if (strlen(attribute) <= 4) {
                break;
            }
            return (const char *)[[NSData dataWithBytes:(attribute + 3) length:strlen(attribute) - 4] bytes];
        }
    }
    return "@";
}