Выпустите NSFileManager, если он никогда не достигает сообщения об освобождении - PullRequest
1 голос
/ 17 декабря 2010

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

У меня есть короткий метод определения, нужно ли добавить файл в список. Одна из проверок требует создания экземпляра NSFileManager. Поскольку некоторые проверки могут потенциально занять много времени, я хочу выпрыгнуть, как только любое из моих условий не будет выполнено. Однако, если я вернусь рано, мой экземпляр NSFileManager никогда не получит сообщение об освобождении.

Я думал об использовании AutoReleasePool, но поскольку объекты, добавленные в autoreleasepools, не освобождаются до конца текущего цикла выполнения, и моя программа просматривает многие тысячи файлов за цикл выполнения, мне не нравится оставлять их все выделяется до конца цикла.

Как я могу гарантировать, что каждый экземпляр моего NSFileManager будет выпущен соответствующим образом. Любые предложения приветствуются.

Спасибо!

- (BOOL) fileShouldBeAdded:(NSString *)filePath {
 BOOL fileShouldBeAdded = TRUE;
 NSFileManager *fileManager = [[NSFileManager alloc] init];
 if ([[filePath lastPathComponent] containsString:@"test.txt"]) {
  fileShouldBeAdded = FALSE;
  return fileShouldBeAdded;
 }
 if (![fileManager xAttrFileAtPathShouldBeAdded:filePath]) {
  fileShouldBeAdded = FALSE;
  return fileShouldBeAdded;
 }
 if ([[BackupManager sharedInstance] isExcludedByUser:filePath]) {
  fileShouldBeAdded = FALSE;
  return fileShouldBeAdded;
 }
 if (![fileManager backupRequiredForPath:filePath]) {
  fileShouldBeAdded = FALSE;
  return fileShouldBeAdded;
 }
 [fileManager release];
 return fileShouldBeAdded;
}

Ответы [ 2 ]

3 голосов
/ 17 декабря 2010

Выполните рефакторинг функции, чтобы управление памятью осуществлялось во внешнем методе, и если внутри, например,

-(BOOL) checkFile: (NSFileManager*) fileManager withPath:(NSString *)filePath
{
if ([[filePath lastPathComponent] containsString:@"test.txt"]) {
  return FALSE;
 }
 if (![fileManager xAttrFileAtPathShouldBeAdded:filePath]) {
  return FALSE;
 }
 if ([[BackupManager sharedInstance] isExcludedByUser:filePath]) {
  return FALSE;
 }
 if (![fileManager backupRequiredForPath:filePath]) {
  return FALSE;
 }
}

- (BOOL) fileShouldBeAdded:(NSString *)filePath {
 NSFileManager *fileManager = [[NSFileManager alloc] init];

 BOOL fileShouldBeAdded = [self checkFile:fileManager withPath:filePath];
 [fileManager release];
 return fileShouldBeAdded;
}
2 голосов
/ 18 декабря 2010

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

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

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

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