[英]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類(模型-視圖-控制器中的模型)來管理數據,則會得到更加整潔有序的依賴關系圖。
希望這可以幫助。
或者您可以設法在字典數組中完成所有這些操作,那么您就不必跟蹤N個數據源數組:
您可以做的是:
MasterArray->保留所有子陣列的鍵->在鍵上添加子陣列數據。 並動態地取消分配這些子數組,因此在內存中您將只有一個masterArray,而沒有N個數據源數組。
例如:
MasterArray {'0'=({一些數組對象}};
'1'=({一些數組對象)};
希望能幫助到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.