如何在objC中存储一个nil指针数组?

时间:2012-07-21 10:46:03

标签: objective-c nsmutablearray

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

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

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

显然,这要求我最初从一个nil指针数组开始,但是objC不会让我在NSArray中放一个nil指针。

我不能在创建数组时向对象添加对象,因为数组索引与表行不对应。

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

3 个答案:

答案 0 :(得分:7)

目标C中的惯用解决方案是使用NSNull

  

NSNull类定义一个单例对象,用于表示集合对象中的空值(不允许使用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)。

答案 1 :(得分:3)

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

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

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

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

答案 2 :(得分:0)