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

Objective c NSURL在创建后几乎立即解除分配(目标C),objective-c,nsurl,memory-management,Objective C,Nsurl,Memory Management,在我的代码中,我在我的应用程序委托的头文件中创建了一个名为fromURL的NSURL对象 NSURL *fromURL; 下面是我设置它的时间: NSOpenPanel* openDlg = [NSOpenPanel openPanel]; [openDlg setCanChooseFiles:NO]; [openDlg setCanChooseDirectories:YES]; [openDlg setCanCreateDirectories:YES]; [openDlg setPrompt

在我的代码中,我在我的应用程序委托的头文件中创建了一个名为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];
}
这是我的问题。当我设置它时,我可以在创建后立即记录它设置为什么,但下次我试图从中获取信息时,它会显示EXC_BAD_ACCESS。我打开了僵尸,它几乎在我设置好后立即变成了僵尸


这怎么会马上被释放

听起来你需要读一下

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

if ([openDlg runModal == NSOKButton)
{
    [fromURL release];
    fromURL = [[openDlg URL] retain];
}
也不要忘记在
-dealoc
方法中释放
fromURL

如果您为
fromURL
定义属性,这可以简化一点,如中所示

@property (nonatomic, retain) NSURL *fromURL;
这样你就可以使用

self.fromURL = [openDlg URL];

除了在
-dealloc
中,您还需要
[fromURL release]

这个alloc/init的目的是什么?它不会做任何事情。我很惊讶它允许您使用“init”方法初始化NSURL。您必须使用initWithString:方法并为NSURL提供一个有效的URL。即使我去掉了init内容,它仍然无法工作。我最初把它放在适当的位置,因为我认为它可能会解决我的问题。我从名为openDLG的NSOpenPanel对象设置URL。我是这样设置的:fromURL=[openDlg URL];如果我在这之后直接从URL登录,它会打印值,但是如果我做了其他任何事情(比如设置另一个对象),那么尝试从URL登录,它会说它已经被释放了。非常感谢,第二种方法成功了!(我没有检查第一个)