-2

我需要有一个恒定计数为 9 的 NSMutableArray,我可以在其中进行特定于索引的插入和删除。我知道这array = [[NSMutableArray alloc] initWithCapacity:9];将声明一个容量为 9 的数组,但是当你获得数组的大小时,它返回 0。

我对解决方案的第一次尝试是声明一个容量为 9 的数组(见上文),然后用 NSNull 对象填充它。此代码因错误而崩溃

[NSMutableArray insertObjects:atIndexes:]:数组参数不是 NSArray'

- (void) setBlankArray: (NSMutableArray*)array {
    for (int i = 0; i < 9; i++) {
        [array insertObjects:[NSNull null] atIndexes:i];
    }
}

-(void) addCurrentTile: (TileView*)aTile {
    [currentTurnTilesArray insertObject:aTile atIndex: aTile.getValue-1];
}

-(void) removeCurrentTile: (TileView*)aTile {
    [currentTurnTilesArray removeObjectAtIndex: aTile.getValue-1];
}

有没有更好的方法来完成它?

4

4 回答 4

3

不确定您要完成什么或为什么,但您removeCurrentTile会破坏它,因为它会将数组的大小减小 1。您需要做的是用一个保护它的类来包装这个数组,这样它就永远不会永远不会有任何其他数量的元素而不是 9。

就个人而言,我认为你试图做的是愚蠢的。如果你知道你总是有 9 个插槽,那么你应该从一个普通数组开始,而不是一个可变数组。您要改变的是每个索引处的对象,而不是数组本身。例如,如果这些东西是字符串,那么你将创建一个由 9 个 NSMutableString 对象组成的不可变数组:

NSArray* arr = @[
    [NSMutableString string],
    [NSMutableString string],
    [NSMutableString string],
    [NSMutableString string],
    [NSMutableString string],
    [NSMutableString string],
    [NSMutableString string],
    [NSMutableString string],
    [NSMutableString string]
 ];

现在每个字符串都可以变异为另一个值,但不能添加或删除字符串,例如更改数组的长度。

当然这只是一个例子(我的意思是使用字符串)。为了获得最大的灵活性,这将是一个由九个 NSMutableDictionary 对象组成的 NSArray。现在每个 NSMutableDictionary 都可以包含任何内容,也可以不包含任何内容。但是 NSMutableDictionaries 的数量总是正好是 9,因为数组本身是不可变的。

于 2013-04-12T21:09:38.253 回答
0

我刚刚阅读了您的问题,我想我完全了解您的需求。这是代码:

声明一个属性:

@property (nonatomic, retain) NSMutableArray *myArray;

合成它:

@synthesize myArray = _myArray;

像这样覆盖它的吸气剂:

- (NSMutableArray *)myArray
{
    if (!_myArray)
    {
        _myArray = [[NSMutableArray alloc] initWithCapacity:9];

        for (int i = 0; i < 9; i++)
        {
            [self.myArray addObject:[NSNull null]];
        }
    }

    return _myArray;
}

“setBlankArray”方法将简单地将属性设置为 nil,下次调用数组属性的 getter 时,它将自动按照您的需要进行初始化:

- (void)setBlankArray:(NSMutableArray *)array
{
    self.myArray = nil;
}

非常重要:不要编写此代码:

for (int i = 0; i < 9; i++)
{
   [self.myArray addObject:[NSNull null]];
}

在刚才提到的方法中,因为这将使数组包含 18 个元素。

然后编写其他2个方法:

// you can also change the parameter from "id" to "TileView *"
- (void)addCurrentTile:(id)sender
{
    NSInteger tileIndex = 1; // replace 1 with ((TileView *) sender).getValue - 1

    [self.myArray replaceObjectAtIndex:tileIndex
                            withObject:sender];
}

// you can also change the parameter from "id" to "TileView *"
- (void)removeCurrentTile:(id)sender
{
    NSInteger tileIndex = 1; // replace 1 with ((TileView *) sender).getValue - 1

    [self.myArray replaceObjectAtIndex:tileIndex
                            withObject:[NSNull null]];
}

但是,不要忘记将“id”替换为“TileView *”,并将 tileIndex 的值设置为“((TileView *) sender).getValue - 1”。

希望这一切都有意义,并对您有所帮助。

此致

于 2013-04-13T08:14:26.553 回答
0

你正在寻找insertObject:atIndex:,或者更简单addObject:

于 2013-04-12T21:01:59.313 回答
0

[[NSMutableArray alloc] initWithCapacity:9]不会创建包含 9 个元素的数组。它创建了一个数组,初始化时具有足够的内存来容纳 9 个对象。此方法的目的是在您声明时一次分配那么多内存,因此您可以向该数组添加元素,系统不必每次都分配内存。这仅用于优化。

NSMutableArray 参考

于 2013-04-12T21:09:03.683 回答