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

属性作为 ac 字符串返回,而不是 NSString。只需更改格式以打印出 ac 字符串,而不是尝试转换它,如下所示:

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

找到了。只需使用

                NSString *value = [self valueForKey:name];

获取属性值...

于 2013-02-06T17:42:20.533 回答
0

当您将 %@ 与对象一起使用时,编译器基本上会尝试通过调用该对象的描述方法来帮助您。您的 objc_property_t 变量不支持该方法。我认为它实际上是一个结构......你不能只是将它转换为 NSString。您需要决定要从中打印什么属性,然后从中检索该值。与您使用 property_getName 检索“name”属性所做的类似。

于 2013-02-06T17:46:28.683 回答