NSMutableArray, alloc или емкость? - PullRequest
2 голосов
/ 05 октября 2009

Есть ли какая-либо причина, чтобы пойти с одним из них, кроме одного, возвращающего объект с автоматическим освобождением, а другому, требующему ручного освобождения?

NSMutableDictionary *drink = [[NSMutableDictionary alloc] init];
// do things ...
[drink release];

OR

NSMutableDictionary *drink = [NSMutableDictionary dictionaryWithCapacity:10];

1007 * Гэри *

Ответы [ 3 ]

6 голосов
/ 05 октября 2009

Это удобные методы, которые полезны для уменьшения объема кода, который вы должны написать, и могут помочь в определенных обстоятельствах.

Получаемый вами объект не будет иметь реальных отличий, за исключением того, что методы + dictionaryWithCapacity: и + dictionary будут автоматически освобождены, а возвращаемый -init - нет.

Кроме того, если вы знаете, сколько элементов будет помещено в словарь, + dictionaryWithCapacity: и -initWithCapacity: обеспечат небольшое повышение эффективности, поскольку словарь сможет выделять нужный объем памяти сразу после летучая мышь.

1 голос
/ 05 октября 2009

Первый будет инициировать NSMutableArray с размером по умолчанию. Поэтому внутренне NSMutableArray перераспределяет пространство по мере необходимости, когда вы добавляете в него новый ключ: значение. В самом деле, вы должны выпустить его самостоятельно, инициализация не вызывается ни одним авто-выпуском.

Второй предварительно выделит 10 слотов в вашем объекте. В этом отношении лучше, если вы заранее знаете, сколько предметов будет в вашем словаре. Этот метод будет автоматически выпущен. Вы также можете вызвать initWithCapacity, который не будет автоматически освобожден, как init, но с предварительно выделенным размером.

Как правило, все методы, начинающиеся с init, должны быть явно выделены с помощью alloc и release вашим кодом, а статический метод, такой как словарь *, автоматически освобождается.

0 голосов
/ 05 октября 2009

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

пример, добавление миллиона объектов в NSMutableArray

с [[NSMutableArray alloc] init] придется перераспределять миллион раз при каждом добавлении объекта.

с [[NSMutableArray alloc] initWithCapacity: 1000000] массив будет выделен с достаточным объемом памяти для миллиона объектов при запуске, поэтому вы не будете подвергаться дополнительным накладным расходам, которые имеет первый метод.

поэтому, если вы знаете, сколько элементов вы хотите поместить в массив заранее, перейдите к начальной емкости.

, если вы этого не сделаете, тогда используйте по умолчанию alloc + init.

вот хорошая статья, которая может дать больше понимания: http://cocoawithlove.com/2008/08/nsarray-or-nsset-nsdictionary-or.html

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