首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSWindowController的showWindow内存泄漏:

NSWindowController的showWindow内存泄漏:
EN

Stack Overflow用户
提问于 2011-05-25 22:41:19
回答 2查看 1.1K关注 0票数 3

我已经和下面的泄漏斗争了一段时间了。我已经通过Instruments将其范围缩小到以下代码块:

代码语言:javascript
复制
- (NewMessageWindowController *)showNewMessageWindowWithRecipients:(NSArray *)recipients {

    NewMessageWindowController * newMessageWindowController = [[NewMessageWindowController alloc] init];
    [newMessageWindowController showWindow:self]; // 100% on this line.
    [newMessageWindowController.toField setStringValue:[recipients componentsJoinedByString:@","]];
    [newMessageWindowController.messageView becomeFirstResponder];
    [windowControllers addObject:newMessageWindowController];
    [newMessageWindowController release];

    return newMessageWindowController;
}

代码块的名称是这样的:

代码语言:javascript
复制
[AppDelegate showNewMessageWindowWithRecipients:[NSArray arrayWithObject:recipient]];

其中recipient只是一个NSString。

这是来自工具的回溯:

代码语言:javascript
复制
  30 Friendz start
  29 AppKit NSApplicationMain
  28 AppKit -[NSApplication run]
  27 AppKit -[NSApplication sendEvent:]
  26 AppKit -[NSWindow sendEvent:]
  25 AppKit -[NSWindow keyDown:]
  24 AppKit forwardMethod
  23 Friendz -[FriendzAppDelegate showNewMessageWindowWithRecipients:] /Path/To/FriendzAppDelegate.m:226
  22 AppKit -[NSWindowController showWindow:]
  21 AppKit -[NSWindow makeKeyAndOrderFront:]
  20 AppKit -[NSWindow _makeKeyRegardlessOfVisibility]
  19 AppKit -[NSWindow _changeKeyAndMainLimitedOK:]
  18 AppKit -[NSWindow becomeKeyWindow]
  17 AppKit _NXResetCursorState
  16 AppKit +[NSEvent _discardCursorEventsForWindowNumber:criteria:]
  15 HIToolbox FlushSpecificEventsFromQueue
  14 HIToolbox PullEventsFromWindowServer
  13 HIToolbox PullEventsFromWindowServerOnConnection(unsigned int, unsigned char)
  12 HIToolbox ConvertPlatformEventRecordAndPostWithOptions(__CGEvent*, _CGSEventRecord const*, short, unsigned char, unsigned char)
  11 HIToolbox PostEventToQueueInternal
  10 HIToolbox _NotifyEventLoopObservers
   9 HIToolbox KeyEventPostedObserver
   8 HIToolbox TSMProcessRawKeyCode
   7 HIToolbox TSMTranslateKeyEvent
   6 HIToolbox GetDataFromUCHRForEvent
   5 HIToolbox ConvertEventUniCharsToCharCodes
   4 HIToolbox utGetInputSourceScriptInfo
   3 CoreFoundation CFLocaleCreateCanonicalLocaleIdentifierFromScriptManagerCodes
   2 CoreFoundation CFStringCreateWithCStringNoCopy
   1 CoreFoundation __CFStringCreateImmutableFunnel3
   0 CoreFoundation _CFRuntimeCreateInstance

windowControllers是在applicationDidFinishLaunching中分配/初始化的NSMutableArray,并在dealloc方法中发布。

NewMessageWindowController中,我使用以下代码通知应用程序代理窗口即将关闭,不再需要保留控制器:

代码语言:javascript
复制
- (void)windowWillClose:(NSNotification *)notification {
    [AppDelegate windowControllerDidFinish:self];
}

应用程序委托的方法如下所示:

代码语言:javascript
复制
- (void)windowControllerDidFinish:(NSWindowController *)controller {
    [windowControllers removeObject:controller];
}

在数组之前和之后进行日志记录是我期望的方式。在窗口关闭之前,控制器就在那里,当窗口关闭时,它就会被移除。

当我关上窗户时,仪器就会发现漏水。虽然它是打开的,但一切似乎都很好。值得注意的是,dealloc在NewMessageWindowController中的调用与预期不谋而合。Leaks不会将控制器本身报告为问题,相反,泄漏的对象是一个NSCFString,它只是源自上面的代码。

Build and Analyze没有检测到任何东西,我非常确定我的内存管理在创建/显示窗口控制器/窗口的代码块上是正常的。

奇怪的是,只有当我使用键盘关闭窗口时才会泄漏。如果我单击红色的关闭按钮,Instruments不会拾取任何东西。

最后,Instruments并不总是显示要负责的代码块。在这些情况下,我的代码都没有在工具中引用-它看起来都是AppKit。同样,这仅在我使用键盘关闭窗口(cmd-w)时才会出现。

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-26 01:14:54

在这种情况下,我要做的是,使用Xcode4中的Instruments版本,配置分配工具来记录保留/释放事件。这应该会告诉你,对于这个特定的控制器,为什么它的保留计数不会为零。请注意,对于基于鼠标和基于键盘的关闭,可能会执行不同的代码路径。

票数 0
EN

Stack Overflow用户

发布于 2011-05-26 01:15:19

这是因为当一个对象被“销毁”时,你不能指望dealloc被可靠地调用--这可能是因为出于某种原因使用键盘不太可能导致立即调用dealloc而不是单击X?

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

https://stackoverflow.com/questions/6126248

复制
相关文章

相似问题

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