如果NSFileManager永远不会到达发布消息,请释放它

时间:2010-12-17 14:14:38

标签: objective-c memory-management

首先,我想提前道歉,因为我不知道这一点。在这种情况下,我一直试图解决处理内存管理的最佳方法。

我有一个简短的方法来确定是否应该将文件添加到列表中。其中一项检查需要实例化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 个答案:

答案 0 :(得分:3)

重构函数,以便在外部方法和if内部管理内存,例如

-(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;
}

答案 1 :(得分:2)

因为你说这被称为成千上万次,所以你最好在循环之外分配NSFileManager - 例如,作为实例变量 - 然后在整个循环中使用相同的实例。

如果你愿意的话,你可以把它作为马克的解决方案作为参数传递。

瞬态分配流量可能对性能极为不利。但是,当然,除非它非常方便或者您已经测量出问题,否则不要打扰。