我想创建一个我想使用类的属性名和属性值序列化为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异常。 我究竟做错了什么? 提前谢谢!
答案 0 :(得分:0)
属性作为c字符串返回,而不是NSString。只需更改格式即可打印出c字符串而不是尝试转换它,如下所示:
[s appendFormat: @"<%@>%s</%@>", name, property, name];
答案 1 :(得分:0)
找到它。只需使用
NSString *value = [self valueForKey:name];
获取属性值...
答案 2 :(得分:0)
当您对对象使用%@时,编译器基本上会尝试通过调用该对象的描述方法来帮助您。您的objc_property_t变量不支持该方法。我认为它实际上是一个结构...你不能只是把它转换为NSString。您需要确定要从中打印的WHAT属性,然后从中检索该值。与使用property_getName检索“name”属性时所做的类似。