【问题标题】:SBJsonParser: App crashes if I do not retain the return valueSBJsonParser:如果我不保留返回值,应用程序会崩溃
【发布时间】:2010-10-06 15:44:52
【问题描述】:

我创建/推送我的 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 release]:消息发送到释放的实例 0x6d51aa0

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

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

错误在哪里?我不能在没有发布的情况下保留parsedJSON。除了dealloc,我永远不会释放parsedJson。使用的库有错误吗?

【问题讨论】:

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


    【解决方案1】:

    [JSONParser objectWithString:] 返回一个自动释放的对象。如果你想保留它,你必须保留它——只有在那个时候你才负责释放它。但如果你没有保留它,那就不要保留它,不要释放它。

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

    【讨论】:

    • 我将属性设置为 ivar=object。没有意识到我必须使用 setter 方法(self.ivar 或 [self setIvar:myVariable])。感谢一百万!
    【解决方案2】:

    在我将值返回给我的其他方法后,我将 parsedJSON 归零

    parsedJSON = nil;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      相关资源
      最近更新 更多