0

我试图了解在 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 种情况下都没有崩溃,但我想阅读关于我应该在哪里分配大量数组的说明:这是同一件事吗?还是在性能和​​内存分配方面有一个最佳位置,以避免一些问题?谢谢!

4

4 回答 4

2

第三个是错误的。您正在多次创建/分配所有数组并仅存储最后一个。

1号和2号都不错。这取决于您的要求。如果您确定在调用方法时只需要一次这些数组,而不是在其他地方。然后2就好了。但是如果你调用它两次,那么它会像 3。

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

于 2013-01-26T09:53:54.613 回答
1

案例 3:

完全不正确:在每次迭代中,您都在“重置”数组内容;在循环结束时,您的数组将只包含您添加的最后一个元素;

情况1:

您在视图生命周期中初始化一次数组;然后每次执行 parse 函数时,都会向这些相同的数组添加新元素;随着您不断调用 parse 方法,数组将变得越来越大,并且将包含所有解析的“历史”;

案例二:

每次输入 parse 函数时,都会“重置”数组,然后用新元素填充它们;在循环结束时,数组将只包含最后一个解析任务的结果。

因此,在 1 和 2 之间,这取决于您要做什么;这两件事都有道理,我敢打赌2。

编辑:

回复您的其他问题(评论):

谢谢@sergio,到目前为止,你的解释是最好的;但是在 ViewController 内分配和初始化数组的危险和问题是什么?

我不会谈论危险或问题:它可以很好地工作,至少对于简单的应用程序来说是这样。

另一方面,假设您想在 2 级视图中显示您解析的内容:首先是项目列表(想象一个表格);然后,当您选择一个项目时,您将移动到另一个视图,显示有关该项目的更多详细信息。

在这种情况下,您将有 2 个不同的控制器需要访问相同的数据。如果您的阵列仅由一个控制器管理,那么另一个则依赖于此。如果您添加更多控制器和访问相同数据的视图,事情可能会变得更加复杂。

因此,这是一个“良好设计”并为变化做好准备的问题:如果您通过 ad-hoc 类(模型-视图-控制器中的模型)管理您的数据,您将获得一个更清晰有序的依赖关系图.

希望这可以帮助。

于 2013-01-26T10:01:22.823 回答
1

正如其他人所说,第三种选择是完全错误的。但是其他两个选项也不是很好。你真的不应该在视图控制器中拥有你的数据模型和解析代码。创建一个类来处理您的数据模型,您可以在其中进行所有解析并将其传递给您的视图控制器,例如在您的 init 方法中。不要让您的视图控制器创建该数据模型对象。

阅读单一职责原则依赖注入

于 2013-01-26T10:09:30.070 回答
0

或者您可以设法在字典数组中完成所有这些事情,然后您不必跟踪 N 个数据源数组:

你可以做的是:

MasterArray -> 持有所有子数组的键 -> 在一个键上添加子数组数据。并动态释放这些子数组,因此在内存中您将只有一个 masterArray 而不是 N 个数据源数组。

例如:

MasterArray { '0' = ( { 一些数组对象 ) };

'1' = ( { 一些数组对象 ) };

希望能帮助到你。

于 2013-01-26T10:02:52.320 回答