2011-09-01 76 views
0

zURL声明如下:为什么我无法访问此实例变量?

.H:

@interface PanelController : NSWindowController <NSWindowDelegate> 
{ 
    NSURL *zURL; 
} 

@property (nonatomic, copy) NSURL *zURL; 

.M:

@synthesize zURL; 

在一个IBAction为我:

- (IBAction)openBrowser:(id)sender { 
    NSOpenPanel *zOpenPanel = [NSOpenPanel openPanel]; 
    [zOpenPanel setCanChooseFiles: TRUE]; 
    [zOpenPanel setCanChooseDirectories: TRUE]; 
    [zOpenPanel setAllowsMultipleSelection: TRUE]; 
    [zOpenPanel setLevel:CGShieldingWindowLevel()]; 
    NSInteger zIntResult = [zOpenPanel runModal]; 
    if (zIntResult == NSFileHandlingPanelCancelButton) { 
     return; 
    } 

    // zURL set here 
    zURL = [NSURL alloc]; 
    zURL = [zOpenPanel URL]; 
    NSLog(@"url = %@", zURL); // works 

    NSString *zStr = [zURL absoluteString]; 
    _fileField.stringValue = zStr; 
    [_importButton setEnabled:TRUE]; 
    [self openPanel]; 
} 

在接下来的IBAction为:

NSLog(@"url = %@", zURL); // EXC_BAD_ACCESS error 
+0

你在哪里申报zURL? –

+0

我编辑我的问题,包括乔治信息.. –

+1

首先 - 摆脱第一个[NSURL alloc]行。这是内存泄漏。第二次使用“self.zURL = [zOpenPanel URL]”。当前你直接设置实例变量的方式。使用self.zURL,您将通过将复制URL的属性访问器。 –

回答

2

您正在将您的URL分配给zOpenPanel的URL属性,但未指示您打算通过保留引用来保留它。

zURL = [NSURL alloc]; // assign my variable to a new URL, allocating memory 

你的第二个行替换,以zOpenPanel的URL属性的引用您参考,您漏水刚创建的URL。

在稍后的某个时间点,zOpenPanel通知操作系统它的URL已完成,并释放内存,从而使您的引用无效。

什么你可能想要做:

zURL = [[zOpenPanel URL] retain]; 

这赋予您参考zOpenPanel的URL属性,并告诉你想拥有部分所有权的它的使用寿命操作系统。

当你与zURL做,你需要释放并放弃您的要求在它的生命周期:

[zURL release]; 

编辑:

,因为你宣布它作为你的类的属性,你应该使用属性标记来调用适当的行为:

self.zURL = [zOpenPanel URL]; 

因为你声明的属性,使其具有复制语义,这将复制网址,哟你仍然需要在你的dealloc中发布它。

+0

感谢一百万和一个。 –

0

我怀疑你的zURL var会在某个时候被释放,正如George指出的那样,如果你发布了zURL的声明,这将会很有帮助。

此外,如果立即在下一行替换zURL的值,则不需要执行[NSURL alloc]。

1

在第一行中,您正在分配NSURL,但不调用初始化程序。在第二行中,您将从另一个位置分配zURL,将指针丢弃到您在第一行创建的对象(这是内存泄漏)。

zURL存储在哪里?它是一个实例变量?如果是这样,你还没有保留从[zOpenPanel URL]返回的内容,因此无法保证该对象在IBAction中被调用时不会被释放。

相关问题