2012-04-28 80 views
0

我不知道为什么,但每当我做一个简单:窗口setContentView崩溃?

[_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,窗口一片空白,然后产生以下情况崩溃:

crash image

任何帮助,不胜感激!

+0

有没有这样的事情,“gdb崩溃”。 GDB是调试器。如果调试器本身崩溃,那么你将会遇到GDB崩溃的唯一方法 - 然后你就不会在Xcode中查看它。 – 2012-04-28 20:03:21

回答

2

发布的代码不会编译。缺少冒号或者我不了解方法签名。

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

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

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

+0

道歉,如果我遗失了冒号的地方,我重写了代码,因为我的规模要大得多。如果我理解你,将unsafe_unretained更改为_strong视图将解决此问题? – Cristian 2012-04-28 16:07:54

+0

ARC说它不允许__strong? – Cristian 2012-04-28 16:14:10

+0

它在哪里说的?你尝试了什么? – 2012-04-28 16:44:55

0

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

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

感谢您的回答,但我的项目正在使用ARC,因此我无法保留 – Cristian 2012-04-28 16:09:49