SBJsonParser:如果我不保留返回值,应用程序崩溃

时间:2010-10-06 15:44:52

标签: iphone cocoa-touch json memory-management exc-bad-access

我创建/推送我的ViewController,显示一些信息并导航回我的RootViewController。当我导航应用程序崩溃时(EXC_BAD_ACCESS)。

使用Instruments我发现调用了我的ViewController的dealloc,它释放了我的包装类。在我的包装器类中,也调用了dealloc方法。此dealloc释放parsedJson(保留属性),然后应用程序崩溃。奇怪的是,尽管只有malloc和释放,保留计数从1下降到-1。

如果我保留了返回的结果parsedJson,则应用程序不会崩溃,我也没有发现泄漏。

SBJsonParser *JSONParser = [SBJsonParser new];
id parsedJson = [[JSONParser objectWithString:jsonString error:NULL] retain];

我无法进行发布/自动发布,因为应用程序会再次崩溃。

使用NSZombieEnabled,我得到了

  

* - [CFDictionary发布]:发送到解除分配的实例0x6d51aa0的消息

我做出改变后得到了这个僵尸。在我为视图控制器使用属性和Interface Builder之前我没有崩溃,因为视图控制器没有立即释放。现在我这样做:

MyViewController *myViewController = [[MyViewController alloc] init];
[[self navigationController] pushViewController:myViewController animated:YES];
[myViewController release];
myViewController = nil;

错误在哪里?没有发布,我无法保留parsedJSON。除了dealloc之外,我永远不会发布parsedJson。使用过的库中是否有错误?

2 个答案:

答案 0 :(得分:1)

[JSONParser objectWithString:]返回一个自动释放的对象。如果你想保留它,你必须保留它 - 只有在那一点上你才有责任释放它。但是如果你没有保留它,那就不要保留它并且不要释放它。

您说您使用的是保留属性,但是您实际使用了该属性(self.ivar = object)还是直接访问了变量(ivar = object)?只有在使用该属性时才会保留该对象。

答案 1 :(得分:0)

将值返回到我的其他方法后,我将parsedJSON

归零
parsedJSON = nil;

因此,如果parsedJSON被解除分配,则不会发生任何事情,因为发送给nil的消息不会导致应用程序崩溃。尽管我没有找到过度释放的原因......