在我的代码中,我在应用程序委托的头文件中创建了一个名为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。我已经打开了僵尸,它在我设置之后几乎立刻变成了僵尸。
这怎么会立即解除分配?!?
答案 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]