Вопрос управления памятью - PullRequest
0 голосов
/ 26 апреля 2011

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

Например, если вы создаете набор миниатюр:

   for(int i=0; i <totalThumbs; i++){        

     Thumb *newThumb = [[Thumb alloc] initWithImage:someImage]

     //position the thumbs here, etc.

     //assume releasing here breaks the app because we need to interact with the thumbs   later
     // [newThumb release] --- breaks the app         

    }

Имеет ли смысл помещать все новые объекты в массив и освобождать их все в viewDidUnload, когда они нам больше не нужны?

Ответы [ 4 ]

3 голосов
/ 26 апреля 2011

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

Thumb *newThumb = [[Thumb alloc] initWithImage:someImage];
[myThumbs addObject:newThumb];
[newThumb release];

Это работает, потому что myThumbs сохраняет объект.

Чтобы не допустить утечки памяти, особенно если вы регенерируете миниатюры, вы захотите перебрать подпредставления суперпредставления.(все большие пальцы), удалите каждого из суперпредставления и отпустите их.Вам также может понадобиться сделать это в методе dealloc, где вы выпускаете суперпредставление (при условии, что вы это делаете).Я считаю, что с массивом можно просто позвонить removeAllObjects.

2 голосов
/ 26 апреля 2011

Может быть, я что-то упустил, но почему бы не использовать autoreleasepools?

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

for(int i=0; i <totalThumbs; i++){        
  Thumb *newThumb = [[[Thumb alloc] initWithImage:someImage]autorelease];
}

[pool drain];

Вызов autorelease добавит его в пул (который вы можете создать в любой области видимости). Просто вызовите сток (или отпустите) в пуле, когда закончите с ним. Это освободит все объекты в очереди.

1 голос
/ 26 апреля 2011

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

for(int i=0; i <totalThumbs; i++){        
    Thumb *newThumb = [[Thumb alloc] initWithImage:someImage]

    //position the thumbs here, etc.

    [thumbsArray addObject:newThumb];

    [newThumb release]; // --- doesn't break the app         

}

In viewDidUnload и / или dealloc освободить массив.Вам не нужно отпускать каждый большой палец.

0 голосов
/ 26 апреля 2011

Мы всегда должны избегать выделения памяти в цикле.В вашем случае вы должны освободить память сразу после использования созданного вами объекта.т.е.

for(int i=0; i <totalThumbs; i++){          

   Thumb *newThumb = [[Thumb alloc] initWithImage:someImage];  

   //position the thumbs here, etc.  

   //assume releasing here breaks the app because we need to interact with the thumbs later  
   // [newThumb release] --- breaks the app  
   // Work with newThumb  
   [newThumb release];
}  

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

Ура!

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