【发布时间】:2011-12-11 22:51:55
【问题描述】:
我的 iPhone 应用程序在运行一段时间后不断收到 BAD_EXC_ACCESS 错误,经过痛苦的调试后,我发现我的一个静态变量(确切地说是 NSPredicate)已损坏:它仍然指向原始地址,但它的 isa 变量已重置为 0!
这完全打败了我,为什么 isa 变量被重置为 0 ?!有什么想法吗?
谢谢!
更新:发布代码。代码其实来自erica's ABContactHelper我稍微改了一下,使用Predicate Templates让查询更高效,所以我加了这个功能:
+ (NSPredicate*) predicateforMatchingName:(NSString*) name {
//templateForMatchingName is a static variable I declare elsewhere
//static NSPredicate * templateForMatchingName =nil;
if (templateForMatchingName == nil) {
templateForMatchingName = [NSPredicate predicateWithFormat:@"firstname contains[cd] $NAME1 OR lastname contains[cd] $NAME2 OR nickname contains[cd] $NAME3 OR middlename contains[cd] $NAME4"];
}
NSDictionary *sub = [NSDictionary dictionaryWithObjectsAndKeys:
name,@"NAME1",
name,@"NAME2",
name,@"NAME3",
name,@"NAME4",
nil];
NSPredicate *pred = [templateForMatchingName predicateWithSubstitutionVariables:sub];
return pred;
}
我一直认为这段代码是完美的“正常”,templateForMatchingName 创建后是不可能更改的。但后来我发现它的 isa 变量被重置了。它不一定设置为 nil。这次我发现它被重置为不同的值。而且奇怪的是,它仍然指向原来的区域。
有什么想法吗?
【问题讨论】:
-
BAD_EXC_ACCESS - 通常意味着您尝试使用已发布的对象。在此处发布您的“坏”代码
标签: objective-c memory-management nsobject