访问属性时出现 EXC_BAD_ACCESS 异常
Posted
技术标签:
【中文标题】访问属性时出现 EXC_BAD_ACCESS 异常【英文标题】:EXC_BAD_ACCESS exception on accessing a property 【发布时间】:2013-02-06 17:16:41 【问题描述】:我想创建一个类,我想使用类的属性名称和属性值将其序列化为 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 异常。 我究竟做错了什么? 提前致谢!
【问题讨论】:
你的意思是[s appendFormat:@"%@%@>", name, (NSString*)property, name]; not [s appendFormat: @"%@%@>", name, (NSString*)property], name];对吗? @MSK,对!在原始问题中修复了它。 【参考方案1】:属性作为 c 字符串返回,而不是 NSString。只需更改格式以打印出 c 字符串,而不是尝试转换它,如下所示:
[s appendFormat: @"<%@>%s</%@>", name, property, name];
【讨论】:
HM,这不会抛出但不会做我需要的,即获取属性的值。我认为问题在于这个 objc_property_t 真的是一个不透明的类型,正如它在这里所说的那样:***.com/a/7336129/1959008。我需要弄清楚如何获取实际值,然后将其转换为 NSString【参考方案2】:找到了。只需使用
NSString *value = [self valueForKey:name];
获取属性值...
【讨论】:
【参考方案3】:当您将 %@ 与对象一起使用时,编译器基本上会尝试通过调用该对象的描述方法来帮助您。您的 objc_property_t 变量不支持该方法。我认为它实际上是一个结构......你不能只是将它转换为 NSString。您需要决定要从中打印什么属性,然后从中检索该值。与您使用 property_getName 检索“name”属性所做的类似。
【讨论】:
以上是关于访问属性时出现 EXC_BAD_ACCESS 异常的主要内容,如果未能解决你的问题,请参考以下文章
尝试更改 Bool 属性时出现 EXC_BAD_ACCESS 错误
在 OCMock 的 andDo 中访问参数时出现 EXC_BAD_ACCESS
读取 NSFetchedResultsController 的 fetchedObjects 属性时出现 EXC_BAD_ACCESS 错误(仅在模拟器上)