Objective c 过度释放会使窗户变得麻木

Objective c 过度释放会使窗户变得麻木,objective-c,cocoa,Objective C,Cocoa,我正在使用Xcode 4.2编写并使用Clang3.0构建一个演示特定崩溃的程序 该程序有一个窗口,它意味着在nib中设置为“关闭时释放”,以便在后续使用中过度释放。它应该是一个工作表,因此使用beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:显示。尝试第二次或第三次显示窗口会使应用程序崩溃 我记得一年前发生过这种情况,程序接收到EXC\u BAD\u ACCESS,并触发调试器在该点停止。我还记得能够使用僵尸模

我正在使用Xcode 4.2编写并使用Clang3.0构建一个演示特定崩溃的程序

该程序有一个窗口,它意味着在nib中设置为“关闭时释放”,以便在后续使用中过度释放。它应该是一个工作表,因此使用
beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:
显示。尝试第二次或第三次显示窗口会使应用程序崩溃

我记得一年前发生过这种情况,程序接收到
EXC\u BAD\u ACCESS
,并触发调试器在该点停止。我还记得能够使用僵尸模板在仪器中查找问题

这正是我想要的(这个程序是演示调试技术的一部分),但现在不是这样。现在,程序没有崩溃;Instruments显示窗口上的retain计数下降到1两次,但没有下降,因此它不会被释放

如果问题到此为止,那就好了;我可以简单地把床单藏起来再看一两次。问题是,当我第二次提到(应该是死的,但至少还有一个保持它活着)表时,它已经麻木了

我的意思是,无论是工作表还是其中的任何控件(它包含一个字段、一个文本视图和两个按钮)都不会响应事件。心跳在里面什么也不做;窗口有一个OK按钮,但当窗口处于麻木状态时,OK按钮不会脉冲。没有什么办法可以消除这张表

但是这个程序没有崩溃。我仍然可以与菜单交互,Dock显示程序正在响应。如果我试图退出,它会发出嘟嘟声,因为它有一张纸

是什么导致窗户麻木,我能做些什么


这里有一个简化版的程序,也显示了这个问题:

我认为您不应该使用
-close
使工作表消失。如果您更改
[sheet close]行要<代码>[图纸订购:自身],则它可以正常工作

至于他们为什么不同,我不知道。但我的经验是,总是使用
-orderOut:
关闭工作表,而从不使用
-close

清单3没有结束选择器

tl;博士:


您使用了错误的方法使面板消失。

附录:进一步使用测试应用程序,工作表看起来会以任何状态返回。如果我通过单击“取消”按钮将其关闭,则“取消”按钮返回时仍会高亮显示。@NJones:no。在这个程序和演示中,我可能会坚持使用MRC,只要新的Cocoa程序员很有可能需要使用MRC代码,即使他们还没有编写。你肯定应该教MRC。ARC不是垃圾收集,它本质上是自动化的MRC。如果你不了解基本原理,你就不知道它在做什么。(抱歉离题)很有趣。缺点是,我需要想一些其他的方法来实现RWC的bug,但这是另一天的问题。Thank.FTD:“调用
orderOut:
方法会导致窗口从屏幕上删除,但不会导致窗口被释放。有关何时释放窗口的信息,请参阅
关闭
方法。”(我也几乎从不使用
-close
);文档确实建议
orderOut:
,但没有明确禁止
close
,也没有给出任何我可以理解的原因。
- (void)didEndSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
{
    [sheet orderOut:self];
}