好吧,我花了最后8个小时与它斗争 - 它似乎超出了我。这是我的完整(相关)代码:
- (void)updateUserDefaults
{
NSMutableDictionary *viewControllerDetails = [[NSMutableDictionary alloc] initWithCapacity:4];
[viewControllerDetails setObject:[NSNumber numberWithInt:OOVenueClassControllerType] forKey:@"classType"];
[viewControllerDetails setObject:self.searchTerm forKey:@"searchTerm"];
[viewControllerDetails setObject:self.searchLocation forKey:@"searchLocation"];
//----- the next two lines cause the problem
NSString *res = [[NSString stringWithFormat:@"%@",[searchResults xmlString]] retain];
[viewControllerDetails setObject:res forKey:@"searchresults"];
//-----
NSMutableArray *viewControllersList = [NSMutableArray array] ;
[viewControllersList addObject:viewControllerDetails];
NSUserDefaults *defs = [NSUserDefaults standardUserDefaults];
//the following line causes the error
[defs setObject:viewControllersList forKey:kViewControllersKey];
[defs synchronize];
[res release];
}
请注意the next two lines cause the problem
的阻止。起初我没有创建另一个字符串,但稍后在尝试解决问题时添加了它。
如果我注释掉这两行,一切正常。如果我把它们放回去,我会得到
- [CFString class]: message sent to deallocated instance 0xa1a9000
我试图将哪些字符串放入userdefaults有什么问题?该字符串相当大(大约200,000个字符),但我过去在用户默认值中存储了更长的字符串。
值得注意的是,如果我卸载应用程序,那么一切正常。但是在随后的运行中,问题就出现了。
那么,字符串被解除分配的方式和原因以及在哪里?我已经明确添加了retain
- 但这仍然无济于事。我错过了什么?
编辑:刚刚意识到我忘了说错误就行了
[defs setObject:viewControllersList forKey:kViewControllersKey];
此外,对于一般信息,- (NSString *)xmlString
上的方法searchResults
完全符合名称的含义:使用该对象的信息创建XML字符串。
编辑2:我尝试使用该字符串执行其他操作 - 将其转换为NSData
,使用zlib进行压缩 - 但无论数据类型如何,该特定对象都会被取消分配。它是否必须使用字符串的大小做某事?
答案 0 :(得分:1)
NSString *res = [[NSString stringWithFormat:@"%@",[searchResults xmlString]] retain];
自动发布。您不需要在方法结束时释放它。你过度释放了它。
此外,您无需保留[searchResults xmlString]
。 stringWithFormat
方法已经为您完成了。
祝你好运!
答案 1 :(得分:0)
好的,不确定问题到底是什么,但它位于searchResults
和/或xmlString
方法的某个位置。 searchResults
对象最初是从从服务器接收的XML创建的(XML被解析为对象结构)。当xmlString
被调用时,由于某种原因,我回来的字符串与原始XML不同(当然我不是在谈论格式化) - 在前500个字符中有200,000个字符长字符串或者所以有一些差异。我一直无法弄明白为什么。因此,我不是从对象结构重新创建xml,而是将原始XML存储在该对象的字段中,并且在调用xmlString
时,只返回原始字符串。现在一切正常。
感谢大家通过这个痛苦的过程给予的支持。