首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >-[NSWindowController window]用window初始化NSWindowController时保留窗口?

-[NSWindowController window]用window初始化NSWindowController时保留窗口?
EN

Stack Overflow用户
提问于 2011-06-13 07:21:25
回答 1查看 1.4K关注 0票数 2

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

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

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

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

代码语言:javascript
复制
(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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-13 08:33:31

-[NSWindowController window]保留窗口很好;问题似乎与自动释放池有关。

代码语言:javascript
复制
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]);

输出为:

代码语言:javascript
复制
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的事情时,我忘记创建一个池。这与我链接到的线程的上下文相匹配。

通常情况下,当没有自动释放池时,我会看到一个例外,所以我猜只是一个池在适当的地方,永远不会被排出。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6325385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档