0

Objective-C ARCアプリケーションで、配列を割り当てるのにどこが良いかを理解しようとしています。

ケース1:解析関数の外部で配列を割り当てて初期化する

- (void)viewDidLoad { // or another method

    // other code
    // here I alloc and init arrays:

    dataSource2 = [[NSMutableArray alloc] init]; 
    dataSource3 = [[NSMutableArray alloc] init]; 
    dataSource4 = [[NSMutableArray alloc] init]; 
    dataSource5 = [[NSMutableArray alloc] init]; 
    dataSource6 = [[NSMutableArray alloc] init]; 
    dataSource7 = [[NSMutableArray alloc] init]; 
    dataSource8 = [[NSMutableArray alloc] init]; 
    dataSource9 = [[NSMutableArray alloc] init]; 
}

- (void)parseFunction {

    // parsing code
    // do something with arrays and iterate, example: 

       for (int i = 1; i < [arrays count]; ++i) {
            [dataSource2 addObject:object2];
            [dataSource3 addObject:object3];
            [dataSource4 addObject:object4];
            [dataSource5 addObject:object5];
            [dataSource6 addObject:object6];
            [dataSource7 addObject:object7];
            [dataSource8 addObject:object8];
            [dataSource9 addObject:object9];
        }
}

ケース2:解析関数内および反復サイクル外のallocおよびinit配列

- (void)viewDidLoad { // or another method

    // other code
}

- (void)parseFunction {

    // here I alloc and init arrays: 

    dataSource2 = [[NSMutableArray alloc] init]; 
    dataSource3 = [[NSMutableArray alloc] init]; 
    dataSource4 = [[NSMutableArray alloc] init]; 
    dataSource5 = [[NSMutableArray alloc] init]; 
    dataSource6 = [[NSMutableArray alloc] init]; 
    dataSource7 = [[NSMutableArray alloc] init]; 
    dataSource8 = [[NSMutableArray alloc] init]; 
    dataSource9 = [[NSMutableArray alloc] init]; 

    // parsing code
    // do something with arrays and iterate, example:

       for (int i = 1; i < [arrays count]; ++i) {

            [dataSource2 addObject:object2];
            [dataSource3 addObject:object3];
            [dataSource4 addObject:object4];
            [dataSource5 addObject:object5];
            [dataSource6 addObject:object6];
            [dataSource7 addObject:object7];
            [dataSource8 addObject:object8];
            [dataSource9 addObject:object9];
        }
}

ケース3:解析関数内および反復サイクル内のallocおよびinit配列

- (void)viewDidLoad { // or another method

    // other code
}

- (void)parseFunction {

    // parsing code, alloc init and iterate, all in the same cycle:

       for (int i = 1; i < [arrays count]; ++i) {

       dataSource2 = [[NSMutableArray alloc] init]; 
       dataSource3 = [[NSMutableArray alloc] init]; 
       dataSource4 = [[NSMutableArray alloc] init]; 
       dataSource5 = [[NSMutableArray alloc] init]; 
       dataSource6 = [[NSMutableArray alloc] init]; 
       dataSource7 = [[NSMutableArray alloc] init]; 
       dataSource8 = [[NSMutableArray alloc] init]; 
       dataSource9 = [[NSMutableArray alloc] init]; 

            [dataSource2 addObject:object2];
            [dataSource3 addObject:object3];
            [dataSource4 addObject:object4];
            [dataSource5 addObject:object5];
            [dataSource6 addObject:object6];
            [dataSource7 addObject:object7];
            [dataSource8 addObject:object8];
            [dataSource9 addObject:object9];
        }
}

さて、私のアプリケーションは3つのケースすべてでクラッシュすることなく動作しますが、多数の配列をどこに割り当てる必要があるかについての説明を読みたいと思います。それは同じことですか?または、パフォーマンスとメモリ割り当ての観点から、いくつかの問題を回避するための最良の位置がありますか?ありがとう!

4

4 に答える 4

2

3番目は正しくありません。すべての配列を複数回作成/割り当て、最後の1つだけを保存しています。

1位と2位はかなり良いです。それはあなたの要件に依存します。これらの配列が必要になるのは、メソッドを呼び出すときに1回だけで、他の場所では必要ないことが確実な場合。それなら2でいいです。しかし、2回呼び出すと、3のようになります。

ただし、すべてのプロパティはviewDidLoadメソッドで初期化されます。

于 2013-01-26T09:53:54.613 に答える
1

他の人が言ったように、3番目のオプションは完全に間違っています。しかし、他の2つのオプションもあまり良くありません。ビューコントローラにデータモデルと解析コードを含めるべきではありません。すべての解析を実行するデータモデルを処理する1つのクラスを作成し、それをViewController(たとえばinitメソッド)に渡します。ビューコントローラにそのデータモデルオブジェクトを作成させないでください。

単一責任の原則依存性注入について読んでください。

于 2013-01-26T10:09:30.070 に答える
1

ケース3:

まったく正しくありません。各反復で、配列の内容を「リセット」しています。ループの最後では、配列には最後に追加した要素のみが含まれます。

ケース1:

ビューの存続期間中に一度配列を初期化します。次に、解析関数を実行するたびに、同じ配列に新しい要素を追加します。配列は、parseメソッドを呼び出し続けるとどんどん大きくなり、たとえば、すべての解析の「履歴」が含まれます。

ケース2:

解析関数に入るたびに、配列を「リセット」してから、新しい要素で埋めます。ループの最後では、配列には最後の解析タスクの結果のみが含まれます。

したがって、1から2の間では、何をしようとしているかによって異なります。どちらも理にかなっているので、2に賭けます。

編集:

他の質問への回答(コメント):

@sergioに感謝します、今まであなたのものが最良の説明です。しかし、ViewController内で配列を割り当てて初期化することの危険性と問題は何ですか?

危険や問題については話しません。少なくとも単純なアプリでは、完全に正常に機能する可能性があります。

一方、解析するコンテンツを2レベルのビューで表示したいとします。最初にアイテムのリスト(テーブルを想像してください)。次に、1つのアイテムを選択すると、別のビューに移動して、そのアイテムに関する詳細が表示されます。

この場合、同じデータへのアクセスを必要とする2つの異なるコントローラーがあります。アレイが1つのコントローラーだけで管理されている場合、もう1つはこれに依存します。また、同じデータにアクセスするコントローラーとビューを追加すると、事態はさらに複雑になる可能性があります。

したがって、これは「優れた設計」と変更への準備の問題です。データをアドホッククラス(model-view-controllerのモデル)で管理すると、依存関係のよりクリーンで整然としたグラフが得られます。 。

お役に立てれば。

于 2013-01-26T10:01:22.823 に答える
0

または、辞書の配列でこれらすべてのことを実行でき、N個のデータソース配列を追跡する必要はありません。

できることは次のとおりです。

MasterArray->すべてのサブアレイのキーを保持->キーにサブアレイデータを追加します。これらのサブ配列を動的に割り当て解除するため、メモリにはmasterArrayが1つだけあり、N個のデータソース配列はありません。

例えば:

MasterArray {'0' =({いくつかの配列オブジェクト)};

'1' =({いくつかの配列オブジェクト)};

それが役に立てば幸い。

于 2013-01-26T10:02:52.320 に答える