0

NSArrayまたはNSDictionaryを返すために、ほとんどの人が以下の実装を使用しているのを見てきました。これは、一部の本が示唆していることでもあります。(iOS開発実用的なアプローチ-)

オプション1

  -(NSArray*)listOfStudents{

    NSMutableArray *temp = [[NSMUtableArray alloc] init];

    //Add elements to the array
    //
    //
    //
    NSArray *students =  [NSArray arrayWithArray:temp];

    return students;
    }



 -(void)viewWillAppear{

    self.studentsList = [self listOfStudents];
    }

しかし、これは以下の方法でも同じことができますか?

オプション2

 -(NSArray*)newListOfStudents{

    NSMutableArray *temp = [[NSMUtableArray alloc] init];
    NSArray *students = [[NSArray alloc]initWithArray:temp];
    [temp release];
    //Add elements to the array
    //
    //
    //


    return students;
    }


-(void)viewWillAppear{



  NSArray *array = [self newListOfStudents];
    self.studentsList = array;
    [array release];

    }

これらのメソッドがメインスレッド自体で呼び出されると想定します。

メモリ使用量の中間、2番目のオプションは、自動解放されたオブジェクトが作成されないため、自動解放プールが空になったときにのみ解放されるため、適切だと思います。

メインの自動解放プールは、アプリが終了したときにのみ排出されると思います。したがって、OPTION 1のメソッドが何度も使用される場合(ViewWillAppearで呼び出されるため)、アプリが終了したときにのみ解放される自動解放プールに多くのリストが含まれると思います。

では、オプション2のアプローチはより良いアプローチですか?

アップデート:

わかりやすくするために、viewWillAppearの実装を更新しました。

4

1 に答える 1

2

2番目の例ではあなたが呼ぶつもりだったと思います

self.studentsList = [self newListOfStudents];

それstudentsListretainedプロパティである場合、これは今リークします。

また、両方の例のその一時配列は、無駄なオーバーヘッドです。2番目の例では、それはまったくナンセンスです。

最もクリーンなソリューションは

-(NSArray *)listOfStudents {
   NSMutableArray *list = [NSMutableArray array];
   // Add things to array
   return list;
}

さらに2つのアドバイス:

1)コードに対して静的アナライザーを実行すると、メモリの問題が発生する可能性があります。
2)メモリ管理に自信がある場合は、ARCに切り替えてください。

于 2012-10-04T12:13:33.933 に答える