绑定插座时 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 中修复。
我有以下文件:
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 中修复。