我想使用指向对象实例的指针数组,但只想在需要时(即懒惰地)创建这些对象的实例。该数组对应于UI中的表,因此每个数组索引对应一个表行。
我想使用NSMutableArray来保存指向对象实例的指针(当用户在UI中选择相应的行时会发生这种情况)。
如果选择了表中的行,则会检查相应的数组条目。如果指针值为nil,则尚未创建实例,因此在该点创建它,并且对象指针存储在相应的索引数组条目中。
显然,这要求我最初从一个nil指针数组开始,但是objC不会让我在NSArray中放一个nil指针。
我不能在创建数组时向对象添加对象,因为数组索引与表行不对应。
这里最好的objC解决方案是什么?
答案 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)
[NSMutableArray arrayWithCapacity:numberOfRows]
怎么样?