【问题标题】:How to Assign a single value to whole NSMutableArray?如何将单个值分配给整个 NSMutableArray?
【发布时间】:2012-01-05 11:18:16
【问题描述】:

我有一个可变数组,比如 20 个对象。它的值类似于@"TRUE",@"FALSE",@"TRUE"...

现在我想将数组的所有值重置@"FALSE"。表示所有值为@"FALSE" (20 times).的数组

我知道如何在索引处添加、插入... 但我想知道如何在单行中将整个数组值设置为 @"FALSE" ??? `不使用循环并替换索引处的对象...?

例如:有可能吗

thArray = [[NSMutableArray alloc] initWithCapacity:20];
theArray = @"FALSE" ;

谢谢...

【问题讨论】:

  • 我很好奇你为什么不想为此使用循环。
  • 示例中的第二条语句将指针设置为指向一个字符串,这不起作用。
  • @sosborn: b'coz 我有 7 个数组,每个数组至少有 50 个对象,我必须通过单击重置这些数组
  • @WTP: 是的,我知道.. 它只是一个例子
  • @Maulik,好的,但我不明白为什么这意味着你不应该使用循环。你担心速度吗?如果是这样,不要。只需花 5 分钟时间让它与循环一起工作,然后查看是否存在任何性能问题。我猜你不会看到任何东西。

标签: iphone objective-c nsmutablearray nsarray


【解决方案1】:

你可以使用 C 数组吗?如果是这样,您可以使用 {0, 1} 作为 {FALSE, TRUE} 的 C 等效项,使用以下命令初始化 C 数组:

unsigned short int cArray[20] = {0};

或:

static unsigned short int cArray[20]; /* all values are zeroes, or FALSEs */

这可能更有效,而不是像现在这样使用 static NSString * const 元素数组。测试两个整数是否等价通常比测试两个字符串的字典等价性更快,因为你的程序必须逐个字符地比较每个字符串。

要重置数组的内容,可以使用C函数memset()

memset(cArray, 0, 20*sizeof(unsigned short int)); /* set all values of cArray to 0 */

如果您需要一个动态大小的数组,请使用带有calloc() 的指针并使用memset() 重置它,如前所述。之后记得free()指针,这样就不会出现内存泄漏:

unsigned short int *cArray = NULL;
size_t cArrayLength = 20; /* can be passed in as a value from another method, etc. */
cArray = calloc(cArrayLength, sizeof(unsigned short int)); /* values are initialized to 0 */
if (cArray) {
    /* use cArray... */
    *(cArray + 8) = 1; /* e.g., set ninth element with the value of 1 */
    /* we don't need cArray any longer, so we free it */
    free(cArray);
}
else
    /* error */

如果您必须在 NSArrayNSMutableArray 中使用带有 NSString *NSNumber * 实例的 Objective-C,则没有现成的初始化方法,您需要使用循环或复制预先存在的数组,如贾斯汀的回答中所述。他也是正确的,如果您想朝这个方向发展,创建和填充数组的方法是一个好主意。

【讨论】:

  • 否则,可以使用保存布尔值的 NSNumber。
  • 你能解释一下这个说法吗 *(cArray + 8) = 1; ?
  • 您正在取消引用cArray 指向的第九个内存位置,以便设置该内存位置的值。实际上,这与cArray[8] = 1; 相同
【解决方案2】:

如果这些是数组中的可变字符串,您只需一行即可完成:

[theArray makeObjectsPerformSelector:@selector(setString:) withObject:@"FALSE"];

【讨论】:

    【解决方案3】:

    这是一种方法:

    NSArray * initialized = ...array with fifty @"FALSE" values...;
    NSMutableArray * a = [initialized mutableCopy];
    ... mutate a ...
    [a setArray:initialized];
    

    如果您实际处理的是布尔值,C 标量会更快(请参阅 Alex 的回答)。

    另一种选择是CFMutableBitVector

    最后,这也是创建函数的好例子。

    【讨论】:

      【解决方案4】:

      1)Either this

      2) Or this

      否则没有循环就没有办法。

      【讨论】:

        【解决方案5】:

        我知道的唯一方法是

          for(int i = 0;i<[theArray count];i++)
            {[theArray replaceObjectAtIndex:i withObject:@"FALSE"];}
        

        【讨论】:

        • 感谢您的回复,但请仔细阅读问题我已经提到我不想使用循环!!!
        • 我知道,但这是你能做到的唯一方法。至少这是我知道的唯一方法
        • 这不管用。这是 Objective-C,而不是 C++。请改用replaceObjectAtIndex:withObject:
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多