3

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

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

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

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

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

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

4

3 回答 3

7

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

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

创建你的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)。

于 2012-07-21T11:00:33.927 回答
3

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

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

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

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

于 2012-07-21T18:17:34.283 回答
0

怎么样[NSMutableArray arrayWithCapacity:numberOfRows]

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html

于 2012-07-21T10:49:12.140 回答