2

クラスのプロパティ名とプロパティ値を使用して、XML としてシリアル化するクラスを作成したいと考えています。そのために、基本クラスに次の関数を作成しました (そこから他のすべてのクラスを派生させます)。

- (NSString*) serialize
{
    unsigned int outCount, i;
    NSMutableString* s = [NSMutableString string];

    Class currentClass = [self class];
    while(currentClass != nil) {
        objc_property_t *properties = class_copyPropertyList([self class], &outCount);
        if(outCount > 0) {
            for(i = 0; i < outCount; i++) {
                objc_property_t property = properties[i];
                NSString *name = [NSString stringWithCString: property_getName(property) encoding: NSUTF8StringEncoding];
                [s appendFormat: @"<%@>%@</%@>", name, (NSString*)property, name];
            }
        }
        free(properties);
    }
    return (NSString*)s;
}

@end

私は、すべてのプロパティが (非アトミックで強力な) NSString* であると想定しています (今のところ、より洗練されたコードは後で提供される予定です)。今、何らかの理由で私がラインを打ったとき

[s appendFormat: @"<%@>%@</%@>", name, (NSString*)property], name];

EXC_BAD_ACCESS 例外が発生しています。私は何を間違っていますか?前もって感謝します!

4

3 に答える 3

0

それを見つけた。使用するだけ

                NSString *value = [self valueForKey:name];

プロパティ値を取得するには...

于 2013-02-06T17:42:20.533 に答える
0

オブジェクトで%@を使用する場合、コンパイラは基本的に、そのオブジェクトのdescriptionメソッドを呼び出して支援しようとします。objc_property_t変数はそのメソッドをサポートしていません。実際には構造体だと思います...それをNSStringにキャストすることはできません。印刷する属性を決定し、その値を取得する必要があります。「name」属性を取得するためにproperty_getNameを使用して行ったのと同様です。

于 2013-02-06T17:46:28.683 に答える
0

プロパティは、NSString ではなく、ac 文字列として返されます。次のように、変換しようとするのではなく、ac 文字列を出力するようにフォーマットを変更するだけです。

            [s appendFormat: @"<%@>%s</%@>", name, property, name];
于 2013-02-06T17:28:29.670 に答える