Сколько объектов создано, если размещено в цикле - PullRequest
1 голос
/ 04 августа 2011

Я пытаюсь сосредоточиться на одном аспекте управления памятью в iPhone SDK.

Если я запустил:

for (int x = 0; x < 10; x++)  {
    NSMutableArray *myArray = [[NSMutableArray alloc] init];
}

Создаю ли я 10 объектов myArray в памяти,или каждый alloc перезаписывает предыдущий?Если последнее, я полагаю, мне понадобится только один [myArray release] после цикла для очистки.Если первое, я полагаю, мне нужен релиз внутри цикла For.

Спасибо.

Ответы [ 6 ]

2 голосов
/ 04 августа 2011

На самом деле у вас есть 10 объектов с 10 утечками. Когда вы выходите из цикла, myArray больше не находится в области видимости (и поэтому недоступен), поэтому нет возможности освободить и 10-е распределение.

2 голосов
/ 04 августа 2011

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

 for (int x = 0; x < 10; x++)  {

    NSMutableArray *myArray = [[NSMutableArray alloc] init];
    ....
    [myArray release];
 }

Если вы не освободите, утечка объекта фактически будет 10, а не 9 согласно комментарию, поскольку вне цикла у вас нет доступа к локальной переменной цикла, и последний выделенный объект также будет недоступен.

1 голос
/ 04 августа 2011

В этом случае вы создаете 10 различных объектов Array, каждый из которых имеет счет сохранения 1 и не имеет ссылки вообще. Это будет «фабрика утечек памяти» с 10 объектами, которые никогда не извлекаются из памяти. :)

ооопс ... не видел релиз ... 9 просочившихся массивов.

1 голос
/ 04 августа 2011

Вы создаете 10 объектов, 9 из которых просочились. Вы должны освободить их после использования в конце цикла.

Это касается не только iPhone SDK. Это базовое управление памятью Какао. Также работает на Mac.

0 голосов
/ 04 августа 2011

В дополнение к тому, что все (правильно) сказали, Какао также поддерживает автоматически выпущенные объекты. Если вы перефразируете свой фрагмент так:

for (int x = 0; x < 10; x++)
{      
    NSMutableArray *myArray = [NSMutableArray arrayWithObjects: ...];     
    //....     
} 

вы по-прежнему выделяете 10 различных массивов, но нет утечка. В конечном итоге они автоматически выпущены.

0 голосов
/ 04 августа 2011
for (int x = 0; x < 10; x++)  {

    NSMutableArray *myArray = [NSMutableArray array]; //Its an autorelease
    ....
}

Это создает 10 различных NSMutableArray объектов. На самом деле вам не нужно освобождать их явно. myArray автоматически освобождается в конце цикла выполнения.

Вы вступаете во владение объектом, если создаете его с помощью метода, имя которого начинается с «alloc» или «new» или содержит «copy» (например, alloc, newObject или mutableCopy), или если вы отправите сообщение «сохранить». Вы несете ответственность за отказ от владения принадлежащими вам объектами, используя release или autorelease. В любое другое время, когда вы получаете объект, вы не должны отпускать его.

В NSMutableArray *myArray = [NSMutableArray array]; вы не вступаете во владение массивом, и он будет автоматически передан вам.

Подробнее об управлении памятью можно узнать здесь .

...