Cocoa -[NSWindowController窗口]当NSWindowController使用窗口初始化时是否保留窗口?

Cocoa -[NSWindowController窗口]当NSWindowController使用窗口初始化时是否保留窗口?,cocoa,nswindowcontroller,Cocoa,Nswindowcontroller,在应用程序(OS X 10.6.7)中,我有一个NSWindowController子类,该子类用-[NSWindowController initWithWindow::初始化,即我已经在代码中创建了窗口;我不是从笔尖加载的 通常,我使用[self window]引用我的NSWindowController子类中的窗口。但是在这种情况下,每次我发送[self window],窗口都会被保留,所以我最终泄漏了很多 这是故意的行为吗?目前,我只是将窗口存储在init方法的实例变量中,而从不发送[s

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

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

这是故意的行为吗?目前,我只是将窗口存储在
init
方法的实例变量中,而从不发送
[self window]

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

(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 = [[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
问题是我在碳事件处理程序(
InstallApplicationEventHandler
)中执行Cocoa操作时忘记创建池。这与我链接到的线程的上下文相匹配


通常情况下,当没有自动释放池时,我会看到一个异常,因此我猜这里只是有一个永远不会被排空的池。

可能是这样的情况,
-window
执行类似于
返回[[u window retain]自动释放]
,您的调试会话不会让相应的自动释放池耗尽。确实有泄漏吗?是的,确实有泄漏。注意上面的“关闭前”;当我试图关闭窗口时会发生这种情况,保留计数与
[self window]
调用的次数成正比。我还发现了另一个关于这一点的说法:我看到线程已经覆盖了
-retain/-autorelease
模式,而且不平衡的autorelease池注释很有趣。除此之外,我没有主意了。谢谢,回来后,你是对的。