窗口setContentView崩溃?

时间:2012-04-28 15:45:07

标签: objective-c cocoa

我不知道为什么,但只要我做一个简单的事情:

[_window setContentView:newView];

我得到'gdb'崩溃。

我有两种方法,'enterFullscreen','exitFullscreen',其中_window是我的主要NSWindow。

NSView *oldView;

- (void)enterFullScreen:(NSView*)newView
{
    oldView = [[_window contentView] view];
    [_window setContentView:newView];
}

- (void)exitFullscreen:(NSView*)newView
{
    [_window setContentView:oldView];
}

这两种方法通过IBAction链接到2个按钮。每当我按下按钮时,视图都会交换,但之后会立即崩溃。

有谁知道为什么?

谢谢大家

编辑:这是我现在的代码:

-(void)enterFullscreen(NSView*)newView
{
    oldView = [[NSView alloc] init];
    oldView = [_window contentView];
    [newView removeFromSuperview];
    [_window setContentView:newView];
}

- (void)exitFullscreen:(NSView*)newView
{
    [_window setContentView:oldView];
}

输入全屏工作正常,但是当我调用exitFullscreen时,Window变为空白然后导致以下崩溃:

crash image

任何帮助都非常感谢!

2 个答案:

答案 0 :(得分:2)

发布的代码无法编译。有缺少冒号或我不以其他方式理解方法签名。

其次,[window contentView]会返回NSView。然后,您可以在其上调用-view方法。那是什么? NSView没有这样的方法。从上下文来看,您的意思是在oldView中保存实际的旧内容视图,那么为什么要调用[window contentView]以外的内容?

无论如何,窗口保留其内容视图。但是,当您交换新的内容视图时,它会释放旧的内容视图并保留新的内容视图。如果您使用的是ARC且oldView不是__strong,或者您没有使用ARC,那么旧的内容视图不会被任何内容保留,并且会被取消分配。

如果这不能解释它,您需要发布确切的异常,崩溃或错误消息并显示它发生的位置。

答案 1 :(得分:0)

的setContentView;发送自动回复消息。此方法导致旧内容视图被释放;如果您打算重复使用它,请确保在发送此消息之前保留它,并在将其添加到另一个NSWindow对象或NSView时适当地释放它。  尝试以下内容。

  [newView retain];
  [oldView removeFromSuperview];
  [_window setContentView:newView];
  [newView release];