NSMutableArray计数方法显示NSMutableArray是否为0?

时间:2010-04-11 09:42:12

标签: objective-c iphone arrays nsmutablearray

这是我的init方法:

-(id)init{

    self = [super init];
    magicNumber = 8;

    myMagicArray = [[NSMutableArray alloc] initWithCapacity:(magicNumber*magicNumber)];
    NSLog(@"this is the magic Array: %d", [myMagicArray count]);

    return self;
}

这是.h:

@interface Magic : NSObject {
    NSMutableArray *myMagicArray;
    int magicNumber;

}

控制台告诉我数字是0而不是64,wt会发生吗?我已经查看了这篇文章:

StackOverflow Link: https://stackoverflow.com/questions/633699/nsmutablearray-count-always-returns-zero

4 个答案:

答案 0 :(得分:8)

你的容量与计数混淆。容量只是为阵列保留的内存空间,因此当阵列扩展时,不需要花时间分配内存。

计数是数组中存储的实际项目数。

-initWithCapacity:方法创建一个数组,其中包含数组在重新分配内存之前可以达到的大小。当您实际-addObject:到数组时,计数会增加。


,———.———.———.———————————————————————————————————.
| 4 | 6 | 8 | <—— room for array to expand ———> |
'———'———'———'                                   |
| count = 3                                     |
|                                               |
'——— memory reserved (capacity) of the array ———'
                        > 3

答案 1 :(得分:1)

“initWithCapacity”方法保留多余的容量,以便后续插入不必调整数组的大小(直到你超过最初保留的容量),而“count”告诉你数组中的实际元素数量(即您插入的号码,而不是可用的总容量。

答案 2 :(得分:0)

当你初始化myMagicArray时,你正在为它创建内存空间......在这种情况下,有足够的内存来容纳64个对象。但是你还没有实际添加任何对象,所以在你添加一个对象之前,计数是0。

答案 3 :(得分:0)

您无法访问capacity属性,也无法代表已填充的大小(由kennytm雄辩地描述)。

一种方法可能是NSMutableArray派生一个类并拦截initWithCapacity方法,记录initialCapacity然后将其转换为< EM>属性。但是,如果你急于求成,你可以使用下面这个简单的方法:

创建一个函数:

NSMutableArray* createArrayWithSize(NSUInteger number)
{
    NSMutableArray* array = [[NSMutableArray alloc] initWithCapacity:number];
    for( NSUInteger i=0;i<number; i++ )
    {
        array[i]=[NSNull null];
    }
    return array;
}

然后按如下方式初始化您的NSMutableArray。

myMagicArray = createArrayWithSize(10);

[myMagicArray count]现在为10。