iOS 6のviewDidUnloadコールバックについての議論

1391 ワード

以前ブログで公式のViewController programming guideに書いたことがありますが、iOS 6以降はこうします.Realy?その後、もっと深く接触して、自分が間違っていることに気づいた.学問には限りがないよ.
iOS 6では、viewDidUnloadコールバックイベントがDeprecatedによって削除されたことが知られています.一方、iOS 4およびiOS 5では、Memory warningがシステムによって受信されると、現在インタフェースに存在しないViewControlのviewDidUnloadイベントが自動的に呼び出されます.(例えば、UINAvigationController Pushスタックに表示されていないViewControllerや、UITAbBarView Controllerに表示されていないサブView Controllerなど)
viewDidUnloadイベントはiOS 6では何もトリガーされないため、アップルはドキュメントで、回収メモリに関する操作を別のコールバック関数:didReceiveMemoryWarningに移動することを提案しています.
didReceiveMemoryWarningでメモリを回収する方法について議論しましたが、stackoverflowで検索した解決策は以下の通りです.
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
  
    if ([self isViewLoaded]  &&  !self.view.window)
    {
        [self  setView:nil];
    }
} 

しかし、このように書くのは以前より手間が省けないようだ.最終的には、メモリを回収する価値がないという記事を見つけました.理由は次のとおりです.
1.UIViewはUIresponderのサブクラスであり、UIresponderにはCALayerのメンバー変数があり、CALayerは具体的に画面に自分を描くために使用される.
2.CALayerはbitmapイメージのパッケージクラスで、UIViewが自身のdrawRectを呼び出すと、CALayerはこのbitmapイメージクラスを作成します.
3.メモリを具体的に占めるのはbitmapイメージクラスで、CALayerは48 bytes、UIViewは96 bytesしか占めていません.一方、iPadのフルスクリーンUIViewのbitmapクラスは12 Mの大きさを占めます!
4.iOS 6では、MemoryWarningが発行されると、bitmapクラスが自動的に回収されます.ただし、UIViewとCALayerクラスは回収されません.これにより、メモリの大部分が回収され、bitmapクラスが必要な場合にCALayerクラスに基づいて再構築されます.
以上、iOS 6は、数十byteのためにメモリの回収に苦労する必要はありません.