【问题标题】:How to store an array of nil pointers in objC?如何在 objC 中存储一个 nil 指针数组?
【发布时间】:2012-07-21 10:46:02
【问题描述】:

我想使用指向对象实例的指针数组,但只想在需要时(即懒惰地)创建这些对象的实例。数组对应UI中的一个表,所以每个数组索引对应一个表行。

我想在创建对象实例时使用 NSMutableArray 来保存指向对象实例的指针(当用户在 UI 中选择相应行时会发生这种情况)。

如果选择了表中的一行,则检查相应的数组条目。如果指针值为 nil,则该实例尚未创建,因此在该点创建,并将对象指针存储在相应的索引数组条目中。

显然,这要求我最初从一个 nil 指针数组开始,但 objC 不允许我将 nil 指针放入 NSArray。

我不能在创建对象时将它们添加到数组中,因为数组索引不会对应于表格行。

这里最好的 objC 解决方案是什么?

【问题讨论】:

    标签: objective-c nsmutablearray


    【解决方案1】:

    Objective C 中惯用的解决方案是使用NSNull:

    NSNull 类定义了一个单例对象,用于表示集合对象中的 null 值(不允许 nil 值)。

    创建您的NSMutableArray,并用[NSNull null] 对象填充它:

    NSMutableArray *array = [NSMutableArray arrayWithCapacity:N];
    for (int i = 0 ; i != 10 ; [a addObject:[NSNull null]], i++);
    

    当您检查NSMutableArray中是否存在对象时,将索引处的对象与[NSNull null]进行比较:如果它们相同,则替换为真实对象;否则,实物已经存在了。

    if ([array objectAtIndex:index] == [NSNull null]) {
        MyRealObject realObject = [[MyRealObject alloc] init];
        [array replaceObjectAtIndex:index withObject:realObject];
    }
    

    ** 编辑摘要 ** 编辑以使用循环初始化数组(感谢bbum)。

    【讨论】:

    • 太好了,这是我正在寻找的解决方案,谢谢。
    • 行不通; arrayWithObjects:count: 的第一个参数必须是指向对象语言数组的 (id*)N 不能大于对象的数量。
    【解决方案2】:

    NSMutableArray 不支持稀疏数组。因此,您可以使用 NSNull 实例(或其他一些“无对象”标记)预先播种数组。比如:

    a = [NSMutableArray array];
    for(int i = 0; i<numberNeeded; i++) [a addObject:[NSNull null]];
    

    或者,如果您的数组真的很稀疏,请考虑使用某种映射。 NSMutableDictionary 可以工作,但需要对象作为键,并且在某些情况下,所有装箱/拆箱都是痛苦的。或者,可以轻松地将 CFDictionary 配置为使用带有对象值的整数键。

    虽然字典对于按索引查找显然较慢,但这种性能差异不太可能导致问题在大多数情况下(但不是全部)。

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 感谢您的回复。不幸的是,'arrayWithCapacity' 为该 潜在 容量保留了内存,数组仍然在添加对象时扩展(并且最初是空的)。此外,即使具有指定的容量,也无法插入超出 [array count] 的现有值(最初为 0)的对象。此外,不能插入 nil 值。
      猜你喜欢
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 2012-11-30
      • 2021-12-18
      • 2013-10-22
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      相关资源
      最近更新 更多