1

実行時にいくつかのメニュー項目を動的にサブメニューに追加しようとしています。NSMenuItem を追加すると表示されます。しかし、コンストラクターへの引数として直接、またはそれを Activated イベントに割り当てることによって、イベント ハンドラーを追加しようとすると、クラッシュが発生します。メニューとサブメニューは Xcode で作成されます。実行時に特定のサブメニューの項目を追加/削除するだけです。

サブメニューが描画されると、クラッシュが発生します。右クリックして、動的サブメニューが存在するアイテムに到達するまでマウスをコンテキスト メニューの上に移動すると、クラッシュします。

クラッシュ レポートはかなり長いですが、最も関連性が高いと思われる部分を以下に示します。

Thread 1 (process 6706):
#0  0x94f73095 in __wait4 ()
#1  0x9928699a in waitpid$UNIX2003 ()
#2  0x004a7d22 in mono_handle_native_sigsegv (signal=11, ctx=0xf6fe0) at mini-exceptions.c:2344
#3  0x004f7645 in mono_arch_handle_altstack_exception (sigctx=0xf6fe0, fault_addr=0xc8080824, stack_ovf=0) at exceptions-x86.c:1135
#4  0x00404061 in mono_sigsegv_signal_handler (_dummy=11, info=0xf6fa0, context=0xf6fe0) at mini.c:6556
#5  <signal handler called>
#6  0x98a83a8b in objc_msgSend ()
#7  0xbfffd920 in ?? ()
#8  0x9730c963 in -[NSCarbonMenuImpl _carbonUpdateStatusEvent:handlerCallRef:] ()
#9  0x973086ee in NSSLMMenuEventHandler ()
#10 0x908f79bb in _InvokeEventHandlerUPP ()
#11 0x9077f394 in DispatchEventToHandlers ()
#12 0x9077e780 in SendEventToEventTargetInternal ()
#13 0x90792655 in SendEventToEventTarget ()
#14 0x908f786a in SendHICommandEvent ()
#15 0x907535f0 in UpdateHICommandStatusWithCachedEvent ()
#16 0x9077abe2 in HIApplication::EventHandler ()
#17 0x908f79bb in _InvokeEventHandlerUPP ()
#18 0x9077f394 in DispatchEventToHandlers ()
#19 0x9077e780 in SendEventToEventTargetInternal ()
#20 0x90792655 in SendEventToEventTarget ()
#21 0x90943054 in SendMenuOpening ()
#22 0x90752dfd in DrawTheMenu ()
#23 0x90945779 in OpenSubmenu ()
#24 0x90752427 in TrackMenuCommon ()
#25 0x9094490d in PopUpMenuSelectCore ()
#26 0x909441e2 in _HandlePopUpMenuSelection7 ()
#27 0x97398295 in _NSSLMPopUpCarbonMenu3 ()
#28 0x973971b1 in -[NSCarbonMenuImpl _popUpContextMenu:withEvent:forView:withFont:] ()
#29 0x97515063 in -[NSMenu _popUpContextMenu:withEvent:forView:withFont:] ()
#30 0x97514f56 in -[NSMenu _popUpContextMenu:withEvent:forView:] ()
#31 0x97515390 in -[NSMenu _popUpMenuWithEvent:forView:] ()
#32 0x9771af45 in -[NSView rightMouseDown:] ()
#33 0x973ed635 in -[NSControl _rightMouseUpOrDown:] ()
#34 0x973ed69f in -[NSControl rightMouseDown:] ()
#35 0x971c8af1 in -[NSWindow sendEvent:] ()
#36 0x971c390f in -[NSApplication sendEvent:] ()
#37 0x970dd62c in -[NSApplication run] ()
#38 0x970805f6 in NSApplicationMain ()
#39 0x06de146b in ?? ()
#40 0x06de1290 in ?? ()
#41 0x000befe4 in ?? ()
#42 0x000bf12f in ?? ()
#43 0x0040dc05 in mono_jit_runtime_invoke (method=0x9e8c1c, obj=0x0, params=0xbffff468, exc=0x0) at mini.c:6438
#44 0x005c49ae in mono_runtime_invoke (method=0x9e8c1c, obj=0x0, params=0xbffff468, exc=0x0) at object.c:2827
#45 0x005c8dc4 in mono_runtime_exec_main (method=0x9e8c1c, args=0xe7f30, exc=0x0) at object.c:4054
#46 0x005c9135 in mono_runtime_run_main (method=0x9e8c1c, argc=0, argv=0x168d18, exc=0x0) at object.c:3678
#47 0x00478685 in mono_jit_exec (domain=0x94e00, assembly=0x1833b0, argc=2, argv=0x168d18) at driver.c:955
#48 0x0047abbf in mono_main (argc=4, argv=0x168d10) at driver.c:1014
#49 0x0000308f in main ()

Xamarin Studio 4.0.12、Mono 3.2.0、Xcode 4.6.3、Xamarin.Mac 1.4.8、OS X 10.8.4 を実行しています。

4

2 に答える 2

0

私たちの経験が光を当てることができることを願っています。コードがないとかなり難しいです。

Xamarin.Mac は、C# 型からこのようなものを抽象化する素晴らしい仕事をします。ただし、避けられないことの 1 つは、各 OS (特にウィンドウ システム) のタイム ペインティング イベントとリソース保持の方法が大きく異なることです。

特に Cocoa Controller スタイルのウィンドウ処理では、メモリ内で常に参照されると予想される項目が既にクリーンアップされているというリスクがはるかに高くなります。これは、Cocoa が Windows/Controller を切り替えて再び再ハイドレートする方がはるかに満足しているように見えるためです。

Tl;DR

  1. menuItems へのモジュラー参照を保持します - それらをコントローラーのフィールドに保存します。それ以外の場合は、それらを収集できます。
  2. 再描画を実行する前に、循環参照がないことを確認してください (オブジェクトに属するデリゲートで動作を定義する Cocoa の習慣により、これは Windows よりもはるかに簡単です)。
  3. メニュー項目の削除は、最後から最初まで行う必要があります (削除するにつれて数が減ることを忘れないでください)。

通常、このような不可解なクラッシュは、デリゲートへの参照を持つオブジェクトを参照するコントロールやデリゲートが消えることが原因であることがわかりました。

より多くのコードがあれば、もっと役立つと確信しています!

チアーズ・イアン

于 2013-09-18T11:22:04.250 に答える