簡體   English   中英

在Object-C中的解析函數內部還是外部分配和初始化NSArrays?

[英]Alloc and init NSArrays inside or outside a parsing function in Objective-C?

我試圖了解WHERE更好地在Objective-C ARC應用程序中分配數組:

案例1 :解析函數之外的alloc和init數組

- (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種情況下都不會崩潰,但是我想閱讀一份說明 ,我應該在哪里分配大量數組:是同一件事嗎? 還是在性能和​​內存分配方面處於最佳位置以避免某些問題? 謝謝!

第三是不正確的。 您正在多次創建/分配所有數組,並且僅存儲最后一個。

第一和第二是相當不錯的。 這取決於您的要求。 如果確定在調用該方法時只需要一次這些數組,而在其他地方則不需要。 那么2就好了。 但是,如果您兩次調用它,它將類似於3。

但是,所有屬性都在viewDidLoad方法中初始化。

情況3:

完全不正確:在每次迭代中,您都在“重置”數組內容; 在循環的最后,您的數組將僅包含您添加的最后一個元素;

情況1:

您可以在視圖生命周期中一次初始化數組; 然后, 每次執行parse函數時,都會向這些相同的數組添加新元素; 當您繼續調用parse方法時,數組將變得越來越大,並且包含所有解析的“歷史記錄”;

情況2:

每次輸入解析函數時,都將“重置”數組,然后用新元素填充它們; 在循環結束時,數組將僅包含最后一個解析任務的結果。

因此,在1到2之間,取決於您要嘗試執行的操作。 這兩件事都說得通,我敢打賭2。

編輯:

回答您的其他問題(評論):

謝謝@sergio,到目前為止,您的是最好的解釋。 但是在ViewController內分配和初始化數組的危險和問題是什么?

我不會談論危險或問題:它可以完美運行,至少對於簡單的應用程序而言。

另一方面,假設您想在2級視圖中顯示解析的內容:首先是一個項目列表(想象一個表);然后是一個列表。 然后,當您選擇一個項目時,將移至另一視圖,顯示有關該項目的更多詳細信息。

在這種情況下,您將有2個不同的控制器需要訪問相同的數據。 如果陣列僅由一個控制器管理,則另一個控制器將依賴於此。 如果您添加更多的控制器和視圖來訪問相同的數據,事情可能會變得更加復雜。

因此,這是“好的設計”和為更改做好准備的問題:如果通過ad-hoc類(模型-視圖-控制器中的模型)來管理數據,則會得到更加整潔有序的依賴關系圖。

希望這可以幫助。

正如其他人所說,第三種選擇是完全錯誤的。 但是其他兩個選項也不是很好。 您實際上不應該在視圖控制器中擁有數據模型和解析代碼。 創建一個類來處理您的數據模型,在其中進行所有解析並將其傳遞給視圖控制器,例如在init方法中。 不要讓您的視圖控制器創建該數據模型對象。

閱讀有關單一責任原則依賴注入的信息

或者您可以設法在字典數組中完成所有這些操作,那么您就不必跟蹤N個數據源數組:

您可以做的是:

MasterArray->保留所有子陣列的鍵->在鍵上添加子陣列數據。 並動態地取消分配這些子數組,因此在內存中您將只有一個masterArray,而沒有N個數據源數組。

例如:

MasterArray {'0'=({一些數組對象}};

'1'=({一些數組對象)};

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM