【问题标题】:Objective-C on iPhone release problemiPhone 上的 Objective-C 发布问题
【发布时间】:2009-04-29 12:23:16
【问题描述】:

我有一个问题,当我在 iPhone 上的 dealloc 中调用 NSStream 对象上的 release 时,我得到了 EX_BAD_ACCESS。

以下代码

- (void)dealloc {
    DLog(@"dealloc started for: %@",self);
    @synchronized(self) {
        lookupCount--;
    if (lookupCount==0) {
        UIApplication* app = [UIApplication sharedApplication];
        app.networkActivityIndicatorVisible = NO;
        }
    }
    DLog(@"inStream retain count before release: %d",[inStream retainCount]);
    [inStream release];
    DLog(@"outStream retain count before release: %d",[outStream retainCount]);
    [outStream release];
    [queryToSend release];
    [resultString release];
    [data release];
    [super dealloc];
    NSLog(@"dealloc finsihed for : %@",self);
    }

与 EX_BAD_ACCESS 在 【外发】; 行。

日志输出如下

2009-04-29 13:16:28.547 App[30580:20b] -[SimpleQuery dealloc] [Line 160] dealloc started for: <SimpleQuery: 0x56e540>
2009-04-29 13:16:28.547 App[30580:20b] -[SimpleQuery dealloc] [Line 168] inStream retain count before release: 1
2009-04-29 13:16:28.548 App[30580:20b] -[SimpleQuery dealloc] [Line 170] outStream retain count before release: 1

想知道是否有人知道为什么会这样?

【问题讨论】:

  • 你能发布你是如何创建你的 inStream 对象的吗?对象可能是通过其他方法自动释放的,这就是为什么当您尝试释放它时它会失败。
  • 它是通过调用 getStreamsToHostNamed:port:inputStream:outputStream: 创建的,我认为它不应该返回自动释放的对象

标签: iphone objective-c memory-management


【解决方案1】:

你在评论中提到了outstream

它是通过调用创建的 getStreamsToHostNamed:端口:输入流:输出流: 不应该返回 autoreleased 我不认为的对象。

事实上,它是自动发布的。除非您将该对象保留在代码中的某个位置,否则您不负责它的内存管理。

你应该看看Apple Memory Management Guidelines

许多类都提供了 形成 +className... 你可以用来 获取该类的新实例。 通常被称为“便利 构造函数”,这些方法创建一个 类的新实例,初始化 并返回给您使用。 虽然你可能认为你是 负责释放对象 以这种方式创建,这不是 根据政策可可的情况 set——方法名不包含 “分配”或“复制”,或以 “新的”。因为类创建了 新对象,它负责 处理新对象。

【讨论】:

  • 谢谢。这看起来很像我未能掌握 [self setStringVariable:aString]; 之间的区别。 self.stringVariable=aString;和 stringVariable=aString;关于合成的保留变量。
【解决方案2】:

一些潜在的问题:

  • 您正在锁定 self 以执行 lookupCount 递减循环,我认为这意味着您希望此代码从不同的线程运行。这应该是一个危险信号,因为如果您同时从两个线程释放实例,其中一个线程最终会尝试释放已经释放的实例。
  • 最后的NSLog 调用将尝试打印已经被释放的self

我知道这些都与[outStream release] 无关,但它们可能是相关的。您可能想尝试使用NSZombieEnabled 进行调试以获取更多信息。

另外,请确保释放 inStream 不会同时隐式释放 outStream 等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    相关资源
    最近更新 更多