2012-04-23 1 views
3

У меня вопрос о распределении памяти для объектов в массиве. Я ищу создать массив объектов, но во время компиляции я не знаю, сколько объектов мне нужно, и, следовательно, не хочу резервировать больше памяти, чем нужно.Распределение памяти для массива объектов. Является ли мое понимание действительным?

Что я хотел бы сделать, это выделить память по мере необходимости. Способ, которым я хотел бы сделать это, - это когда пользователь нажимает кнопку «Добавить», массив увеличивается на один дополнительный объект и выделяется необходимая память для нового объекта.

В моем начинающему понимании Objective C (я был профессиональным программистом около 20 лет назад, и только недавно начали писать код еще раз) я пришел со следующими сегментами кода:

первых, я заявил, мой объект:

NSObject *myObject[1000]; // a maximum number of objects. 

Затем, когда пользователь нажимает на кнопку Добавить это работает метод с кодом распределения: (примечание: переменная я начинается при значении 1 и увеличивается каждый раз, когда кнопка Добавить)

++i 
    myObject[i] = [[NSObject alloc] init]; 

Таким образом, я надеюсь только выделить память для необходимых объектов, а не всех 1000 объектов массива немедленно.

Я правильно интерпретирую это? Другими словами, могу ли я исправить в своей интерпретации, что количество элементов массива, указанных в объявлении, является MAXIMUM возможным количеством элементов массива, а не тем, сколько памяти выделено в этот момент? Он это правильно, то теоретически, декларация:

NSObject *myObject[10000]; 

не будет тянуть больше памяти, чем декларация:

NSObject *myObject[5]; 

Может кто-то подтвердить, что я правильно понять этот процесс, просветить меня если у меня это перепуталось в моем сознании. :)

Спасибо!

+0

Почему вы не используете NSMutableArray или CFMutableArray? Он эффективно добавляет объекты. Вот источник для CFArray, если вы хотите взглянуть: http://www.opensource.apple.com/source/CF/CF-635/CFArray.c –

+0

Спасибо за этот отзыв. Я уверен, что это, вероятно, так, как я должен это делать. Я до сих пор не слышал об этом. Любопытно, хотя я знаю, что я, вероятно, повторно изобретаю колесо, теоретически, насколько я понимаю точное распределение памяти? –

+0

Никогда не используйте C-массивы объектов Objective-C, это плохая идея. Используйте объекты массива, предоставленные языком. Я * настоятельно рекомендую вам прочитать книгу Objective-C. Лучший (IMHO) - [Программирование в Objective-C] (http://www.amazon.com/dp/0321811909/) Стивена Кочана. –

ответ

3

Ваше понимание в основном верное. Когда вы делаете:

NSObject *myObject[1000];

Вы сразу же выделить память для 1000 указателей на NSObject экземпляров. Самки NSObject не выделяются, пока вы не сделаете [[NSObject alloc] init].

Однако выполнение NSObject *myObject[10000] будет занимать больше места, чем занятие NSObject *myObject[5], потому что 10 000 указателей, конечно, требуют больше памяти для представления, чем 5 указателей.

Помните, что оба вещей потребляют пространство, указатель на NSObject и сам NSObject экземпляра, хотя на практике пространства, которое в NSObject, например, будет значительно больше, чем 4 байта, потребленного указатель, который ссылается на него.

Во всяком случае, что более важно, существует лучший способ управления распределением динамических объектов в какао. Используйте встроенный класс NSMutableArray.Нравится:

NSMutableArray* objects = [[NSMutableArray alloc] init]; 
[objects addObject: [[[NSObject alloc] init] autorelease]]; 
+0

Отличное объяснение. Благодарю. Я полностью забыл о том, что сами указатели имели выделенную память. По сути, объекты в основном являются типом записи базы данных. объект NS, содержащий кучу переменных и несколько методов. –

+0

Прямо сейчас я могу получить доступ к переменным в объекте с помощью методов доступа, таких как: x = [myObject var]; Если я добавляю myObject в объекты массива, есть ли простой способ использовать методы доступа myObject? Я уверен, что это что-то вроде: x = [[objects ] var]; –

+0

Да, это близко. Это 'x = [[objects objectAtIndex: ] var]'. Вы можете найти [справочные документы] (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html). – aroth

4

Почему бы не использовать NSMutableArray? Вы можете initWithCapacity или просто выделить [NSMutableArray array]. Он будет расти и уменьшаться при добавлении и удалении объектов. Например:

NSMutableArray *array = [NSMutableArray array]; 
NSObject *object = [[NSObject alloc] init]; 

[array addObject:object]; // array has one object 
[array removeObjectAtIndex:0]; // array is back to 0 objects 

// remember to relinquish ownership of your objects if you alloc them 
// the NSMutable array was autoreleased but the NSObject was not 
[object release]; 
+0

Ознакомьтесь с документами NSMutableArray и NSArray, чтобы просмотреть все остальные интересные функции, которые у них есть. https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html –

+0

NSArray выпускает все свои объекты, когда получает вызов dealloc. Вот почему, если у вас есть, например, синтезированное свойство типа 'NSArray', вам нужно только освободить NSArray в' -dealloc', а не его содержимое. –

+0

@JackLawrence, это правильно, однако вызов alloc для объекта увеличивает его счет на 1. Добавление этого объекта в NSArray также увеличивает его количество удержания до 2. Если бы я не вызывал [release объекта], когда я это делал, удаление объекта из массива будет оставить счетчик объектов равным 1, тем самым предотвращая восстановление памяти системой. –

 Смежные вопросы

  • Нет связанных вопросов^_^