2016-04-16 2 views
0

Я пытаюсь использовать зажигалку примитивный массив, потому что хранить сотни тысяч NSNumbers в NSMutableDictionary вызывает как потребление памяти 40-50MB ..Correct примитивный массив размера

Это мой код:

NSUInteger highestModelID = [self.externalDB intForQuery:@"SELECT `id` FROM `models` ORDER BY `id` DESC"]; 

CGFloat modelsPricesForCustomer[highestModelID]; 
memset(modelsPricesForCustomer, 0, highestModelID*sizeof(NSUInteger)); 

NSLog(@"%i", highestModelID); 
NSLog(@"%lu", (sizeof modelsPricesForCustomer)); 

highestModelID34078, но размер говорит, что это 136312. Разве я неправильно его расписываю или неправильно читаю?

ответ

2

highestModelID - количество элементов в modelsPricesForCustomer, а не его размер. sizeof, с другой стороны, возвращает размер массива в байтах, т.е. highestModelID*sizeof(CGFloat)

С sizeof(CGFloat) на вашей системы 4, результаты являются правильными:

34078 * 4 = 136312 

Примечание:

memset(modelsPricesForCustomer, 0, highestModelID*sizeof(NSUInteger)); 
//              ^^^^^^^^^^ 

должно быть

memset(modelsPricesForCustomer, 0, highestModelID*sizeof(CGFloat)); 
//              ^^^^^^^ 

, чтобы избежать ясности ng часть памяти или идет за конец выделенного буфера, когда sizeof(NSUInteger) != sizeof(CGFloat)

+0

Да, я заметил, что написал «memset» неправильно; это действительно должно быть 'sizeof (CGFloat)'. Я также должен, вероятно, сделать '(maximumModelID + 1) * sizeof (CGFloat)', поэтому я могу фактически установить окончательный идентификатор в его диапазоне. Спасибо за подсказку :). Я приму ответ, когда закончится время. –

+1

@Allendar Не используйте символ '+ 1' в' memset'. Если вы это сделаете, вы перепишете память за пределы массива. Плохо. – rmaddy

+0

@dasblinkenlight Спасибо за подсказку! Я изменил его. Могу ли я на самом деле установить 'CGFloat modelsPricesForCustomer [mostModelID]' каким-то образом как '@ property' или использовать' static' для решения этой проблемы? Проблема в том, что 'highModelID' известен только после выполнения запроса. 'CGFloat modelsPricesForCustomer []' явно не сработает. –