2012-04-28 9 views
0

私はさっぱりだが、なぜ私はシンプル行うたび:ウィンドウsetContentViewクラッシュ?

[_window setContentView:newView]; 

を私は「GDB」クラッシュを取得します。

私は2つのメソッド 'enterFullscreen'、 'exitFullscreen'を持っています。ここで、_windowは私のメインNSWindowです。

NSView *oldView; 

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

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

これらの2つのメソッドは、IBActionを持つ2つのプッシュボタンにリンクされています。ボタンを押すたびにビューが切り替わりますが、すぐにクラッシュが続きます。

誰にも理由がありますか?

おかげでみんな

EDIT:

-(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でそれを調べることはありません。 –

答えて

2

投稿されたコードはコンパイルされません。コロンがないか、メソッドシグネチャを他の方法で理解していません。

第2に、[window contentView]NSViewを返します。その後、-viewメソッドを呼び出します。あれは何でしょう? NSViewにはこのような方法はありません。コンテキストからは、実際の古いコンテンツビューをoldViewに保存することを意味するので、なぜ[window contentView]を超えて何かを呼び出すのですか?

とにかく、ウィンドウはコンテンツビューを保持します。ただし、新しいコンテンツビューでスワップすると、古いコンテンツビューが解放され、新しいコンテンツビューが保持されます。 ARCを使用していてoldView__strongでない場合、またはARCを使用していない場合は、古いコンテンツビューは何も保持されず、割り当てが解除されます。

それについて説明していない場合は、例外、クラッシュ、またはエラーメッセージを正確に投稿し、発生している箇所を表示する必要があります。

+0

私がコロンをどこかに紛失しているとお詫び申し上げます。私があなたを理解していれば、ビューでunsafe_unretainedを_strongに変更するとこれが修正されますか? – Cristian

+0

ARCは__strongを許可していないと言いますか? – Cristian

+0

それはどこにありますか?何を試しましたか? –

0

setContentView;自動リリースメッセージを送信します。このメソッドを使用すると、古いコンテンツビューが解放されます。再利用を計画している場合は、このメッセージを送信する前に保持しておき、別のNSWindowオブジェクトまたはNSViewに追加するときに適切に解放するようにしてください。 次のように試してみてください。

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

あなたの答えをありがとうが、私のプロジェクトはARCを使用しているので、私は保持することはできません – Cristian

関連する問題