2012-04-28 79 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