3

这是与块相关的内存管理的一个微不足道的问题,我不确定fc应该在何时/何地释放

NSFileCoordinator *fc = [[NSFileCoordinator alloc] initWithFilePresenter:nil];
NSError *error = nil;
[fc coordinateWritingItemAtURL:sourceURL
                       options:NSFileCoordinatorWritingForDeleting
                         error:&error
                    byAccessor:^(NSURL *newURL) {

            // if error is not nil this block will not be called
            NSError *anError = nil;
            NSFileManager *fm = [NSFileManager defaultManager];
            [fm removeItemAtURL:newURL error:&anError];
            dispatch_async(q_main, ^{
                // change to the main queue and update the UI
                completion(anError);
        });
        // *** (1) Release here ? ***
        // [fc release];
        }];

// *** (2) or Release here ? ***
// [fc release]

if (error) {
    // change to the main queue and update the UI
    dispatch_async(q_main, ^{
        completion(error);
    });
}

我认为在 (1) 发布就可以了(没有泄漏),但这真的是标准的做事方式吗?(释放同一对象调用的块中的对象??)。我觉得这里有些奇怪。

在 (2) 处,也可以,但只是因为访问器块是同步调用的。

出于学习目的......如果访问器块将被异步调用怎么办?(NSFileCoordinator 不需要的假想情况)在这种情况下,我需要制作fc一个 ivar 还是作为第一种方法就可以了?

任何帮助表示赞赏

:)

4

1 回答 1

2

对于给定的代码,我将在 (2) 处发布。fc如果您在 (1) 处释放,您可以从其下方撕下。没有办法知道fc调用块后可能需要做什么。

对于异步情况,我使用了这样的代码(尽管不是 with NSFileCoordinator):

__block NSWindowController *wc = [[NSWindowController alloc] initWithWindowNibName:@"foo"];
[NSApp beginSheet:[wc window] modalForWindow:[self window] completionHandler:^(NSInteger returnCode) {
    if(NSOKButton == returnCode) {
      // Do something
    }
    [wc release], wc = nil;
  }];

-beginSheet:modalForWindow:completionHandler:是我添加到的类别NSApplication

于 2011-11-07T11:38:00.943 回答