2012-10-25 8 views
8

私は理解に近づいていると思いますhow Mono GC and ObjC ref counting live togetherMonoTouch GCがrefcount> 1の管理対象オブジェクトを強制終了できないのはなぜですか?

ネイティブオブジェクトの参照カウントが1の場合、管理対象インスタンスがガベージコレクションされることを防ぐことはできません。 参照カウントが1以上になると、マネージインスタンスがガベージコレクションされなくなります。

これは、管理対象オブジェクトにユーザー状態が含まれている可能性があるためです。対応するネイティブオブジェクト(マネージUIViewインスタンスなど)をミラーリングしているマネージオブジェクトの場合、MonoTouchはそのインスタンスに状態が含まれていないことを認識しています。マネージコードがマネージインスタンスへの参照を持たないと、GCは収集します。後で管理対象インスタンスが必要な場合は、新しいインスタンスを作成するだけです。

私はスコープの外管理リファレンススリップを聞かせて、その後、GCを実行し、私のViewにサブビューとして追加、UIButtonを継承CustomButtonを作成するのであれば、このCustomButtonはまだコレクションの対象にはなりません管理。

なぜ収集できないのですか?もちろん、プロパティのような管理された状態のがあるかもしれませんが、管理対象オブジェクトからのリンクがない場合、この状態を気にする人はですか?それはちょうど消えるかもしれません、なぜそれはできませんか?

私は1つの考えられる理由を考えています:CustomButtonのイベントを購読すると、GCのためにそのイベントが維持されないので、オブジェクトが収集されるとイベントが発生しなくなります。これは予期せぬ動作を引き起こします。

これは間違いありませんか?誰もそれをリンクしていなくても、管理オブジェクトを生きたままにする理由はありますか?

答えて

6

なぜ収集できないのですか?もちろん、それはプロパティのような管理された状態を持つかもしれませんが、管理されたオブジェクトからのリンクがない場合、この状態を気にするのは誰ですか?それはちょうど消えるかもしれません、なぜそれはできませんか?

ネイティブコードでオブジェクトへの参照が含まれている可能性があります。そのため、あとでオブジェクトがマネージコードに再び書き込まれる可能性があります。

私はコードサンプルが何が起こるかを説明すると考えている:

class MyView : UIView { 
    public string ImportantSecret; 
} 

class AppDelegate : UIApplicationDelegate { 
    UIViewController vc; 
    public override bool FinishedLaunching (UIApplication app, 
              NSDictionary options) 
    { 
     var myView = new MyView(); 
     myView.ImportantSecret = "MonoTouchRocks"; 

     vc = new UIViewController(); 
     vc.View = new UIView(); 
     vc.View.AddSubView (myView); 

     // When this method returns the only place where myView is referenced 
     // is from inside the *native* Subviews collection. 

     BeginInvokeOnMainThread (() => 
     { 
      Console.WriteLine (((MyView) vc.Subviews [0]).ImportantSecret); 
      // If the MyView instance was garbage collected and recreated 
      // automatically at this point, ImportantSecret would be null. 
     }); 
    } 
} 

重要:このコードは、単にGCの状態を有することができる管理対象オブジェクトを収集できない理由を説明することです。 Subviews配列は自動的にマネージコードにキャッシュされるので、この特定のサンプルは重要な秘密を実際に忘れることはありませんが、これは一般的に真実ではありません。

+0

私はついにそれを手に入れました。ここでのあなたのサポートは欠かせません。 –

+1

私はあなたの2つの質問とRolfのすばらしい答えが好きです。ちょうど新しいことを学んだ:-) –

+0

私はこれを抱いて遊んできました。 myView変数がusingブロック内に作成された場合はどうなりますか?計測器ツールは、インスタンスが解放されることを示します。それは非常に扱いにくいと感じますが、私はコードの振る舞いにおいてアイデンティティと問題はできません。思考? @rolf –

関連する問題