2012-01-06 10 views
3

私たちはiPhone 4g/4gsでは問題なく動作するアプリをappstoreに持っていますが、 iPod上ではいつも「ランダム」な場所でクラッシュするので驚きました。裾の痕跡を見ると、私のビューコントローラはGCされているようです。GCが実行された管理対象オブジェクトでobjective-cから呼び出されたセレクタ、viewcontrollersがGC'dされないようにする方法

public void PushShowTeamController (Object a) 
{ 
    var teamController = new TeamController (a); 
    NavigationController.PushViewController (teamController, true); 
} 

iPodはsuddentlyこのようなエラーがスローされますので:私の経験から

Jan 6 18:52:09 unknown MyApp[5197] <Warning>: Received memory warning. 
Jan 6 18:52:10 unknown UIKitApplication:mypackage.app[0x9db2][5197] <Notice>: Unhandled Exception: System.Exception: Selector invoked from objective-c on a managed object that has been GC'ed ---> System.MissingMethodException: No constructor found for MyApp.TeamController::.ctor(System.IntPtr) 
Jan 6 18:52:10 unknown UIKitApplication:mypackage.app[0x9db2][5197] <Notice>: at System.Activator.CreateInstance (System.Type type, BindingFlags bindingAttr, System.Reflection.Binder binder, System.Object[] args, System.Globalization.CultureInfo culture, System.Object[] activationAttributes) [0x00000] in <filename unknown>:0 
Jan 6 18:52:10 unknown UIKitApplication:mypackage.app[0x9db2][5197] <Notice>: at System.Activator.CreateInstance (System.Type type, System.Object[] args, System.Object[] activationAttributes) [0x00000] in <filename unknown>:0 
Jan 6 18:52:10 unknown UIKitApplication:mypackage.app[0x9db2][5197] <Notice>: at System.Activator.CreateInstance (System.Type type, System.Object[] args) [0x00000] in <filename unknown>:0 
Jan 6 18:52:10 unknown UIKitApplication:mypackage.app[0x9db2][5197] <Notice>: at MonoTouch.ObjCRuntime.Runtime.ConstructNSObject (IntPtr ptr, IntPtr klass) [0x00000] in <filename unknown>:0 
Jan 6 18:52:10 unknown UIKitApplication:mypackage.app[0x9db2][5197] <Notice>: --- End of inner exception stack trace --- 

答えて

6

につながる可能性が配置され、オブジェクトが後はによってを再舗装されていますネイティブコード。

MyApp.TeamControllerへの参照は、ネイティブコードで要求(アクセスなど)できる限り、管理コードで保持する必要があります。

ほとんどの場合、MonoTouchは参照が保持されるようにします。あなたのコード:

NavigationController.PushViewController (teamController, true); 

が正しいとUINavigationControllerがあなたのteamControllerへの参照を保持します。しかし、別のコントローラでPushViewControllerを呼び出すと、最初の参照は上書きされ、ガベージコレクタ(GC)によって収集可能になります。この状況はあなたが見ている例外につながります。

注:GCが参照されていないオブジェクトインスタンスを収集する時期を予測できないため、例外はランダムにスローされるようです。

+0

これらをローカルで追跡するためにGCにメモリを強制的に強制する方法はありますか?私の4gsデバイスはあまりにも多くのメモリを持っています:-)それとも、それらを追跡するためにたくさんのメモリを割り当てるダミーコードを書く必要がありますか? –

+0

iOSシミュレータでデバッグする際、MonoTouchは 'GC.Collect'を非常に頻繁に呼び出すスレッドを起動し、** help **(保証しない)にそのような問題を発見します。これは、MonoTouch 4以来** GCがより積極的になっていることで知られています。 – poupou

+0

自分では見たことがありませんが、ユーザーからのクラッシュログ(1日に1000 DLを1日に3〜4日)ほとんどの場合、メモリの少ない3GSなどの「古い」デバイスからのものです。さて、私は深く掘り下げようとします。再度、感謝します。 –

1

を私は多くを使用するときにこの問題が発生した

は、私はこのようなメソッドを記述する場合のViewControllerをゴミとして収集されますdispose()をnullに設定する代わりに管理オブジェクトに渡し、GCにジョブを任せてください。 (非参照がインスタンスに残っていない場合)にも廃棄組み合わせる匿名デリゲート()オブジェクトを管理するときこれが起こるような問題

+0

disposeを使用していませんが、ビューコントローラの変数をプッシュするコントローラのインスタンス変数に変更すると役立ちそうです。おそらく、新しいView Controllerをプッシュする正しい方法でしょうか?あなたは彼らへの参照が必要ですか? –

関連する問題