Метод подсчета NSMutableArray показывает, что массив NSMutableArray равен 0? - PullRequest
3 голосов
/ 11 апреля 2010

Это мой метод инициализации:

-(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, что случилось? Я уже проверил этот пост:

Ссылка на StackOverflow: /511390/nsmutablearray-count-vsegda-vozvraschaet-nol

Ответы [ 4 ]

8 голосов
/ 11 апреля 2010

Вы путаете емкость с количеством. Емкость - это только пространство памяти, зарезервированное для массива, поэтому при расширении массива не требуется времени для выделения памяти.

Количество - это фактическое количество элементов, хранящихся в массиве.

Метод -initWithCapacity: создает массив empty с указанием того, насколько большим может быть массив до перераспределения памяти. Количество увеличивается, когда вы на самом деле -addObject: к массиву.


,———.———.———.———————————————————————————————————.
| 4 | 6 | 8 | <—— room for array to expand ———> |
'———'———'———'                                   |
| count = 3                                     |
|                                               |
'——— memory reserved (capacity) of the array ———'
                        > 3
1 голос
/ 11 апреля 2010

Метод initWithCapacity резервирует избыточную емкость, чтобы последующим вставкам не приходилось изменять размер массива (пока вы не превысили первоначально зарезервированную емкость), в то время как «count» сообщает фактическое количество элементов в массиве ( т.е. число, которое вы вставили), а не общая доступная емкость.

0 голосов
/ 16 мая 2015

Вы не можете получить доступ к свойству capacity, и оно не представляет заполненный размер (как красноречиво описано 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.

0 голосов
/ 11 апреля 2010

Когда вы запускаете myMagicArray, вы создаете для него пространство памяти ... в этом случае достаточно памяти для хранения 64 объектов. Но вы еще не добавили к нему никаких объектов, поэтому счетчик будет равен 0, пока вы не добавите объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...