gpt4 book ai didi

cocoa - -[NSWindowController窗口]当NSWindowController用窗口初始化时保留窗口?

转载 作者:行者123 更新时间:2023-12-03 16:38:50 25 4
gpt4 key购买 nike

在应用程序(OS X 10.6.7)中,我有一个 NSWindowController 子类,它是用 -[NSWindowController initWithWindow:] 初始化的 - 即,我已经创建了代码中的窗口;我不是从 Nib 加载它。

通常,我使用 [self window] 引用我的 NSWindowController 子类中的窗口。但在这种情况下,每次我发送[self window]时,窗口都会被保留,所以我最终会泄漏很多。

这是预期的行为吗?目前,我已经解决了这个问题,只需将窗口存储在 init 方法中的实例变量中,并且从不发送 [self window]

我很确定这不会发生,因为 NSWindowController 正在尝试加载窗口:-loadWindow 不会保留窗口,并且 -isWindowLoaded > 返回 YES:

(gdb) set $window = (id)[self window]
Current language: auto; currently objective-c
(gdb) p (int)[$window retainCount]
$1 = 3
(gdb) p (BOOL)[self isWindowLoaded]
$2 = 1 '\001'
(gdb) call (void)[self loadWindow]
(gdb) p (int)[$window retainCount]
$3 = 3
(gdb) p (int)[[self window] retainCount]
$4 = 4
(gdb) p (int)[[self window] retainCount]
$5 = 5

最佳答案

-[NSWindowController window] 保留窗口就可以了;该问题似乎与自动释放池有关。

window = [[NSWindow alloc] initWithContentRect:NSMakeRect(100, 100, 200, 200)
styleMask:NSTitledWindowMask
backing:NSBackingStoreBuffered
defer:NO];
NSWindowController *controller = [[NSWindowController alloc] initWithWindow:window];
[window setTitle:@"testing"];
[window makeKeyAndOrderFront:nil];
[window release];
NSLog(@"[window retainCount]: %d", [window retainCount]);
[controller window];
[controller window];
[controller window];
NSLog(@"[window retainCount]: %d", [window retainCount]);

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[controller window];
[controller window];
[controller window];
NSLog(@"[window retainCount]: %d", [window retainCount]);
[pool drain];
NSLog(@"[window retainCount]: %d", [window retainCount]);

输出为:

2011-06-12 19:26:52.337 window[5517:a0b] [window retainCount]: 1
2011-06-12 19:26:52.339 window[5517:a0b] [window retainCount]: 4
2011-06-12 19:26:52.340 window[5517:a0b] [window retainCount]: 7
2011-06-12 19:26:52.340 window[5517:a0b] [window retainCount]: 4

问题是我在 Carbon 事件处理程序 (InstallApplicationEventHandler) 中执行 Cocoa 操作时忘记创建池。这与我链接到的线程的上下文相匹配。

通常,当不存在自动释放池时,我会看到异常,因此我猜测只是存在一个永远不会耗尽的池。

关于cocoa - -[NSWindowController窗口]当NSWindowController用窗口初始化时保留窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6325385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com