我创建/推送我的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
。使用过的库中是否有错误?
答案 0 :(得分:1)
[JSONParser objectWithString:]返回一个自动释放的对象。如果你想保留它,你必须保留它 - 只有在那一点上你才有责任释放它。但是如果你没有保留它,那就不要保留它并且不要释放它。
您说您使用的是保留属性,但是您实际使用了该属性(self.ivar = object)还是直接访问了变量(ivar = object)?只有在使用该属性时才会保留该对象。
答案 1 :(得分:0)
将值返回到我的其他方法后,我将parsedJSON
parsedJSON = nil;
因此,如果parsedJSON
被解除分配,则不会发生任何事情,因为发送给nil的消息不会导致应用程序崩溃。尽管我没有找到过度释放的原因......