我需要一个常量计数为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];
}
有没有更好的方法来实现它?
答案 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个对象。
此方法的目的是在声明时立即分配那么多内存,这样就可以向此数组添加元素,系统不必每次都分配内存。这仅用于优化。
答案 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;。
希望这一切都有意义,对你有所帮助。
祝你好运