NSMutableArray,大小为9

时间:2013-04-12 21:00:38

标签: objective-c

我需要一个常量计数为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 个答案:

答案 0 :(得分: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的 number 总是正好是9,因为数组本身是不可变的。

答案 1 :(得分:0)

您正在寻找insertObject:atIndex:,或更简单地addObject:

答案 2 :(得分:0)

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

NSMutableArray reference

答案 3 :(得分: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;
}

&#34; setBlankArray&#34;方法将模拟将属性设置为nil,下次调用数组属性的getter时,它将自动初始化为您所需的内容:

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

非常重要:不要写这段代码:

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

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

然后写另外两种方法:

// 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]];
}

但是,不要忘记替换&#34; id&#34;使用&#34; TileView *&#34;,并将tileIndex的值设置为&#34;((TileView *)sender).getValue - 1&#34;。

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

祝你好运