NSURL在创建后几乎立即被解除分配(目标C)

时间:2011-09-20 20:56:46

标签: objective-c nsurl memory-management

在我的代码中,我在应用程序委托的头文件中创建了一个名为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。我已经打开了僵尸,它在我设置之后几乎立刻变成了僵尸。

这怎么会立即解除分配?!?

1 个答案:

答案 0 :(得分:0)

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

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

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

不要忘记在fromURL方法中发布-dealloc

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

@property (nonatomic, retain) NSURL *fromURL;

这样你可以使用

self.fromURL = [openDlg URL];

并且不必担心保留/释放除-dealloc之外仍然需要[fromURL release]