【问题标题】:NSMutableArray count method show the NSMutableArray is count 0?NSMutableArray 计数方法显示 NSMutableArray 计数为 0?
【发布时间】:2010-04-11 09:42:12
【问题描述】:

这是我的初始化方法:

-(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

【问题讨论】:

    标签: objective-c iphone arrays nsmutablearray


    【解决方案1】:

    您将容量与计数混淆了。容量只是为数组保留的内存空间,所以当数组扩展时,不需要花时间分配内存。

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

    -initWithCapacity: 方法会创建一个 数组,并提示在内存重新分配之前该数组可以达到多大。当您实际 -addObject: 到数组时,计数会增加。


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

    【讨论】:

    • 你不需要容量。这是一种优化,取决于您指定的容量大小和 NSArray 选择的内部算法,实际上可能会被忽略。只需在获得对象时添加对象,使用 -addObject: 或 -insertObject:。与 CFArray 不同,NSArray 的容量不是硬性限制。这只是一个建议。如果您以随机顺序获取对象(但带有索引号),则可以创建一个数组并使用 -addObject: 用 [NSNull null] 对象填充它,然后将 NSNull 替换为您得到的实际对象。但后者很少需要。
    • 能够像这样迭代对象插入会很好:for(int i=0; i&lt;array.capacity; i++) - 没有办法吗?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 那么,我可以得到容量数吗?
      【解决方案4】:

      您无法访问 capacity 属性,并且它不代表 populated 大小(正如 kennytm 雄辩地描述的那样)。

      一种方法可能是从NSMutableArray派生一个类并拦截initWithCapacity 方法,记录initialCapacity,然后在属性中生成它。但是如果你赶时间,你可以使用下面这个简单的方法:

      创建一个函数:

      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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-10
        • 1970-01-01
        • 1970-01-01
        • 2013-08-03
        • 1970-01-01
        相关资源
        最近更新 更多