26

iOSでのオブジェクトの遅延インスタンス化はかなり一般的であると聞きましたが、いつ使用すべきか正確にはわかりませんか?レイジーインスタンス化を使用する必要がある場合と、initメソッドでプロパティを初期化する必要がある場合について簡単に説明してもらえますか?

レイジーインスタンス化に関する私の懸念は、特に初期化する複数のプロパティがある場合、多くのコードが必要になることです(initメソッドですべてを記述する場合と比較して)。

4

4 に答える 4

18

私のコメントを詳しく説明します。この手法は、一度だけ構成する必要があるオブジェクトがあり、initメソッドを乱雑にしたくない構成が含まれている場合に適していることがあります。

- (UIView *)myRoundedView;
{
    if (!_myRoundedView) {
        _myRoundedView = [[UIView alloc] initWithFrame:<#some frame#>];
        _myRoundedView.layer.cornerRadius = 10.f;
        _myRoundedView.backgroundColor    = [UIColor colorWithWhite:0.f alpha:0.6f];
        _myRoundedView.autoresizingMask   = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    }
    return _myRoundedView;
}

これはかなり不自然な例ですが、メリットがわかり始めます。メソッドはクラスのようであり、1つのことをうまく行う必要があります。このメソッドは、必要なroundedViewを返します。このコードをinitメソッドに平手打ちした場合、initメソッドは、このビューとそこで平手打ちした他のオブジェクトをインスタンス化して構成する方法の詳細を知る必要があります。

于 2012-05-24T15:22:30.557 に答える
13

大きなメモリフットプリントを持つ可能性のあるオブジェクトがある場合に適しているため、コンテナクラスの初期化時にこれらの高価なオブジェクトをすべて初期化することを回避できます。遅延初期化は、いくつかの状況でメモリ消費を維持できます...

ただし、すべてのオブジェクトがコンテナオブジェクトの初期化の直後または直後に初期化を必要とする場合、遅延初期化は意味がなく、標準のコンストラクタ初期化を使用する必要があることは明らかです。

クラス内にオプションのオブジェクトがあり、すべてのクラスワークフローで初期化できない場合は、レイジー初期化を使用する必要があります。

于 2012-05-24T14:48:27.677 に答える
11

他の手法と同様に、何かを怠惰にインスタンス化するタイミングを指示する、万能のルールは1つではありません。インスタンス化に費用がかかるものには、遅延インスタンス化を使用することをお勧めします。何かが多くのディスクまたはネットワークアクセスを行う必要がある場合、またはセットアップに多くのCPU時間を要する場合は、実際に必要になるまで(またはバックグラウンドで行う)その作業を延期することをお勧めします。特に、ユーザーが使用する場合と使用しない場合がある機能の場合、セットアップに多くの時間を費やす-init(または同様の)意味はありません。そうすることで、アプリケーションがユーザーに遅く感じられる可能性があります。

そうは言っても、時期尚早の最適化は避けるべきです。明白な方法で物事を実行し、パフォーマンスの問題を見つけ、問題を完全に理解するためにコードのプロファイルを作成するまで、パフォーマンスに役立つ複雑なコードの記述に多くの時間を費やさないでください。それが終わったら、物事を改善するために変更を加えることができます。

于 2012-05-24T14:47:36.673 に答える
3

メモリとパフォーマンスだけでなく、これをチェックしてください。別の例を次に示します。

- (NSArray *)validElements{
    if (!_validElements) {
        _validElements = [[NSArray alloc] initWithObjects:
                          @"mystuff",@"generaldescription",@"title",@"autor",
                          @"version",@"date",@"context",@"operatingsystem",@"kindofdevice",
                          @"deviceversion",@"rule",@"daytime",@"time",@"location",@"deviceheading",
                          @"region",@"language",nil];
    }
    return _validElements;
}

遅延インスタンス化を使用して、カスタムの初期化または特別な構成を行うことができます。また、これはメモリとパフォーマンスにもメリットがあります。

于 2012-10-24T14:39:10.003 に答える