【问题标题】:What are the basic differences between these ways creating and handling arrays?这些创建和处理数组的方式之间的基本区别是什么?
【发布时间】:2012-08-07 20:24:00
【问题描述】:

我不确定用 10 个 MyClass 类型的固定大小的对象来声明我的数组的方法,以及这些不同的替代方案对效率、易于编码或其他方面的影响。

...牢记 xCode4.4 的新功能,尤其是:

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

...当然还有使用 ARC

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

替代1

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

方法声明:

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

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

替代方案2

    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 这些数组放在主内存中 - 不是堆栈 - 但我不确定!

替代方案3

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 {

非常感谢您为我们带来光明!

【问题讨论】:

    标签: iphone ios arrays nsarray


    【解决方案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;
    }
    

    产生这个错误:“array initializer must be an initializer list”

    【讨论】:

    • 非常感谢您提供这篇文章的链接——这确实有助于解释 Apple 只提到而没有解释它的内容——即使在有关新 Xcode4.4 功能的详细文档中也是如此。但是,我不明白你为什么说“不能做备选方案 1”
    • 我的意思是,如果您将“C”数组和它管理的对象混合在一起,ARC 经常会抱怨 - 它无法跟踪这些对象,因此无法确保对象被正确保留和释放。我相信 llvm 网站上的 ARC 文档中涵盖了这个主题:clang.llvm.org/docs/AutomaticReferenceCounting.html
    猜你喜欢
    • 2013-08-26
    • 2017-05-11
    • 1970-01-01
    • 2016-03-03
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多