【问题标题】:NSURL getting deallocated almost immediately after creation (Objective C)NSURL 在创建后几乎立即被释放(目标 C)
【发布时间】:2011-09-20 20:56:45
【问题描述】:

在我的代码中,我在应用程序委托的头文件中创建了一个名为 fromURL 的 NSURL 对象。

NSURL *fromURL;

这是我设置它的时候:

NSOpenPanel* openDlg = [NSOpenPanel openPanel];
[openDlg setCanChooseFiles:NO];
[openDlg setCanChooseDirectories:YES];
[openDlg setCanCreateDirectories:YES];
[openDlg setPrompt:@"Select"];
if ([openDlg runModal] == NSOKButton )
{
    fromURL = [openDlg URL];
}

这是我的问题。当我设置它时,我可以在它创建后立即 NSLog 设置的内容,但下次我尝试从中获取信息时,它会显示 EXC_BAD_ACCESS。我打开了僵尸,它几乎在我设置后立即变成了僵尸。

这怎么会立即被释放?!?

【问题讨论】:

  • 分配/初始化的目的是什么?它不会做任何事情。
  • 我很惊讶它允许你使用“init”方法来初始化一个 NSURL。您必须使用 initWithString: 方法并为 NSURL 提供一个有效的 URL。
  • 即使我摆脱了初始化的东西,它仍然不起作用。我最初把它放在适当的位置是因为我认为它可能会解决我的问题。我从一个名为 openDLG 的 NSOpenPanel 对象设置 URL。这是我的设置方式: fromURL = [openDlg URL];如果我 NSLog fromURL 在此之后立即打印该值,但如果我做任何其他事情(例如设置另一个对象)然后尝试 NSLog fromURL 它说它已经被解除分配。

标签: objective-c nsurl memory-management


【解决方案1】:

听起来你需要阅读Memory Management Programming Guide

这里发生的情况是您的 fromURL 变量是一个 ivar(至少,我假设它是一个 ivar,您可能已经将其设为全局变量)。你在你的方法中分配给它。但是你没有处理内存管理,所以当控制返回到运行循环并且自动释放池被耗尽时,你的 fromURL ivar 最终指向一个释放的对象。您需要酌情保留和释放。对于这种特殊的方法,我可能会使用

if ([openDlg runModal == NSOKButton)
{
    [fromURL release];
    fromURL = [[openDlg URL] retain];
}

别忘了在你的-dealloc方法中释放fromURL

如果您为 fromURL 定义一个属性,这可以稍微简化一下,如下所示

@property (nonatomic, retain) NSURL *fromURL;

这样你就可以使用

self.fromURL = [openDlg URL];

并且不必担心保留/释放,除非在 -dealloc 中您仍然需要 [fromURL release]

【讨论】:

  • 非常感谢,第二种方法奏效了! (第一个我没查)
猜你喜欢
  • 1970-01-01
  • 2022-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 2018-11-16
  • 2013-12-12
  • 2017-09-23
相关资源
最近更新 更多