对象被解除分配 - 为什么?哪里?

时间:2012-01-04 21:05:40

标签: iphone nsstring memory-management

好吧,我花了最后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进行压缩 - 但无论数据类型如何,该特定对象都会被取消分配。它是否必须使用字符串的大小做某事?

2 个答案:

答案 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时,只返回原始字符串。现在一切正常。

感谢大家通过这个痛苦的过程给予的支持。