Методы класса, используемые много раз, вызывают утечки? - PullRequest
1 голос
/ 14 августа 2010

Допустим, я разрабатываю игру.Я запускаю следующий метод класса тысячи раз:

NSBundle * bundle = [NSBundle mainBundle];

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

3 вопроса:

  • Утечка памяти?
  • Если я запустил:

NSAutoReleasePool * pool = [[NSAutoReleasePool alloc] init];[сток бассейна];

будет ли тогда эффективно освобождать все те NSBundles, созданные в методе класса?

  • , если я напишу:

pool = nil;

вместо записи:

[сток бассейна];

Будет ли достигнут тот же эффект?Это хорошая практика?

Три вопроса взаимосвязаны, и я уточню тот, который их проясняет:)

Ответы [ 2 ]

1 голос
/ 14 августа 2010

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

setting pool =ноль;ничего не делает, кроме утечки всего пула, возможно, если пул был установлен в свойстве, то есть

 @property(nonatomic, retain) NSAutoreleasePool *pool;

 self.pool = [[[NSAutoreleasePool alloc] init] autorelease];

 //now, self is the sole retainer of pool, so if self abandons it it gets drained:

 self.pool = nil;

 //pool's retain count drops to zero, pool drains.

Если вы делаете это тысячи раз, это может замедлить процесс, чтобы истощать пул каждый раз, подумайтеэто каждые 5 или 10 раз, установить счетчик в цикле и, когда он достигнет определенного числа, сделать это:

 self.pool = [[[NSAutoreleasePool alloc] init] autorelease];
 //this will get rid of the old pool and put in a new one, so you only have to get rid of the one remaining at the end of the loop.
0 голосов
/ 14 августа 2010
  1. Нет, память не просочилась.[NSBundle mainBundle] возвращает объект с автоматическим выпуском, поэтому пул автоматического выпуска позаботится об этом.Однако, если вы собираетесь вызывать его несколько раз в одной функции или чем-то еще, вам лучше либо получить ссылку на него один раз и просто держаться за него, когда вам это нужно, либо создать свой собственный пул автоматического выпуска..
  2. Не совсем.Все, что после NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; будет автоматически освобождено, перейдет в pool, и после того, как вы очистите пул, они будут освобождены.Примечание: [pool drain]; также освобождает пул, поэтому не вызывайте [pool drain]; [pool release];, иначе вы дважды отправите объекту сообщение release и, возможно, произойдет сбой.
  3. Нет.pool = nil; просто потеряет ссылку на pool, и фактический объект pool будет пропущен.Вам нужно позвонить либо [pool drain];, либо [pool release];, и хорошей практикой будет установить pool = nil; впоследствии.
...