这是我的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会发生吗?我已经查看了这篇文章:
答案 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。