Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Over-release that makes the window go numb

I'm using Xcode 4.2 to write and Clang 3.0 to build a program that demonstrates a particular crash.

The program has a window that it means to keep around that is set in the nib to “Release When Closed”, so it's over-released in subsequent uses. It's meant to be a sheet, so it's shown using beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:. Trying to show the window a second or third time should crash the app.

I remember that happening a year ago, with the program receiving EXC_BAD_ACCESS and that triggering the debugger to stop at that point. I also remember being able to hunt the problem down in Instruments using the Zombies template.

That's what I want (this program is part of a presentation to show debugging techniques), but that's not what's happening now. Now, the program doesn't crash; Instruments shows that the retain count on the window gets down to 1 twice, but no lower, so it does not get deallocated.

That would be fine if the problem stopped there; I could simply hide and show the sheet another time or two. The problem is, the second time I bring up the (should-be-dead-but-still-has-at-least-one-retain-keeping-it-alive) sheet, it's numb.

By that I mean that neither the sheet nor any control in it (it contains a field, a text view, and two buttons) responds to events. The heartbeat does nothing in it; the window has an OK button, but when the window is numb, the OK button does not pulse. Nothing works to dismiss the sheet.

But the program is not crashed. I can still interact with the menus and the Dock shows that the program is responding. If I try to quit it, it beeps, since it has a sheet up.

What's causing the window to go numb, and what can I do about it?

Here's a reduced version of the program that also exhibits the problem: https://github.com/boredzo/NumbWindow

like image 297
Peter Hosey Avatar asked Oct 20 '11 04:10

Peter Hosey


People also ask

What was Taylor Swift's first song called?

"Tim McGraw" is the debut single by American singer-songwriter Taylor Swift, who wrote it with Liz Rose for her self-titled debut album. It was released to US country radio on June 19, 2006, by Big Machine Records.


1 Answers

I don't think you should be using -close to make the sheet go away. If you change the [sheet close]; line to be [sheet orderOut:self];, then it works properly.

As for why they're different, I don't know. But my experience has been to always use -orderOut: to dismiss sheets, and never -close. The documentation backs me up on this:

Listing 3 Did-end selector

- (void)didEndSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
{
    [sheet orderOut:self];
}

tl;dr:

You're using the wrong method to make the panel go away.

like image 78
Dave DeLong Avatar answered Sep 24 '22 14:09

Dave DeLong