这些创建和处理数组的方法有哪些基本区别?

时间:2012-08-07 20:24:01

标签: iphone ios arrays nsarray

我不确定用固定大小的10个MyClass对象声明我的数组的方法,以及这些不同替代方案对效率,编码的简易性或其他任何内容的影响。

...请记住新的xCode4.4功能,特别是:

  • 对于NSArray和NSDictionary类,提供了支持 Objective-C文字。
  • Objective-C支持使用'[]'语法进行订阅 容器对象。

......当然还有ARC

特别是我需要编写结构返回这些数组的构造方法。

Alternative1

  MyClass* objectOfMyClass;
  MyClass* array1[10];
  array1[5] = objectOfMyClass;

方法声明:

- (MyClass*[]) createArray {   <--- is this declaration correct like this ?

PS。 AFAIK将这些数组放在堆栈内存中 - 但我不确定!

Alternative2

    MyClass* objectOfMyClass;

    NSMutableArray *array2 = [[NSMutableArray alloc] init];
    for (int i = 0; i<10; i++)
        [array2 addObject:objectOfMyClass]; //objects get added in some way...
    //can't directly access nTh object in this case, need to add from 0 to 9
    //conversion to non mutable array, since size will not change anymore
    NSArray *array3 = [NSArray arrayWithArray:array2]; 

方法声明:

- (NSArray*) createArray {

PS。 AFAIK这些数组放在主内存中 - 而不是堆栈 - 但我不确定!

Alternative3

NSArray *array4 = [[NSArray alloc] init];
array4 = ...how to prepare the array so it can hold 10 objects without using NSMutableArray ?
            otherwise I do not see a difference to alternative 2...
for (int i = 0; i<10; i++)
    array4[i] = objectOfMyClass];

方法声明:

- (NSArray*) createArray {

非常感谢为此带来光明!

1 个答案:

答案 0 :(得分:1)

有一篇关于文字here的精彩文章。你不能做替代方案1.最好的方法是:

NSMutableArray *holdsMyClass = [NSMutableArray arrayWithCapacity:10]; // sized so array does not need to realloc as you add stuff to it

你不能通过索引超过大小来任意增加数组的大小 - 如果索引为5的对象,你可以替换它:

holdsMyClass[5] = obj;

例如,如果您尝试编译它,它将失败:

- (NSArray*[]) createArray
{
    NSArray *foo[10];
    foo[2] = [NSArray array];

    return foo;
}

生成此错误:“数组初始化程序必须是初始化程序列表”