绑定插座时 NSViewController 未解除分配

NSViewController not dealloc'd when outlets are bound

我有以下文件:

Main.storyboard

这与创建新项目时创建的默认情节提要相同,但添加了一些内容:视图中有一个按钮连接到视图控制器的 button 出口([ 的实例=13=]) 和视图控制器上的 doTheThing: 操作。

ViewController.m

#import "ViewController.h"

@interface ViewController ()
@property (weak) IBOutlet NSButton *button;
@property (weak) NSViewController *controller;
@end

@implementation ViewController

- (IBAction)doTheThing:(id)sender {
    if (self.controller) {
        NSLog(@"Removing %@", self.controller);
        [self.controller.view removeFromSuperview];
        [self.controller removeFromParentViewController];
    } else {
        self.controller = [[NSStoryboard storyboardWithName:@"Another" bundle:[NSBundle mainBundle]] instantiateInitialController];
        [self addChildViewController:self.controller];
        [self.view addSubview:self.controller.view];
        NSLog(@"Adding %@", self.controller);
    }
}

@end

Another.storyboard

一个简单的故事板,包含一个设置为初始控制器的场景(视图控制器 + 视图),并且是 AnotherViewController 的一个实例。视图中有一个标签 未连接到任何插座

另一个ViewController.m

#import "AnotherViewController.h"

@interface AnotherViewController ()
@property (weak) IBOutlet NSTextField *label;
@end

@implementation AnotherViewController

- (void)dealloc {
    NSLog(@"Deallocing AnotherViewController %@", self);
}

@end

当我 运行 应用程序并单击按钮时,它会添加来自 Another.storyboard 的视图控制器和视图,当我再次单击按钮时,它们将被删除,并且 [=15] 的实例=] 被释放。

但是,如果我将 Another.storyboard 中的标签连接到 AnotherViewController 上的 label 插座,则不会发生释放。为什么会这样,我该如何解决?

编辑:我确实有一些解决方法,但它们不是很理想,我更愿意理解为什么推荐的方法(故事板和出口)不起作用正确。

不理想的解决方法 1:做同样的事情,但从 XIB 文件加载视图控制器和视图。这按预期工作,但理想情况下我可以使用故事板做同样的事情。

不理想的解决方法 2:在视图控制器的 viewDidLoad 方法的代码中手动绑定我的所有插座。这既乏味又丑陋,因为它需要遍历所有视图的子视图并比较标识符。

Apple 已确认(通过错误报告)这是一个已知问题,将在 OS X 10.10.3 中修复。