tags:

views:

585

answers:

2

I'm getting peppered with

* __NSAutoreleaseNoPool(): Object 0x1961180 of class NSEvent autoreleased with no pool in place - just leaking

warnings during run-time and have no idea what the cause is. Cursory Googles indicate that this is a symbol I can break on with Xcode, but adding it as a symbolic breakpoint via Run>Manage Breakpoints>Add Symbolic Breakpoint, or simply via the breakpoints management window, results in a breakpoint with a - next to it instead of a check, which I take to mean it's a symbol that can't be found.

I've tried adding the symbol "__NSAutoreleaseNoPool" with two underscores, one underscore, and now I'm just feeling stupid. The errors continue to get logged and no breakpoints get hit. Any pointers for breaking on Obj-C symbols or debugging this would be appreciated.

[EDIT: after maybe 10 (10 more, so a couple dozen total, including at least two Xcode restarts) runs I got "Pending breakpoint 9 - "__NSAutoreleaseNoPool" resolved" printed to my console and the breakpoint started working. Is there any way to force a pending breakpoint to actually resolve?]

A: 

The issue here is simple: You are releasing with no pool in place. This usually happens in command line tools written against Foundation. Simply add the following code to your main(): (Irrelevant parts omitted)

int main (…) {
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  /// Your code goes here.

  [pool drain]; // This one might not strictly speaking be neccessary.
  [pool release];

   return 0;
}

Edit: If you are not creating a command line tool, chances are you are doing something naughty; but nonetheless: If you have code you invoke before NSApplicationMain(), you need to wrap this in the same basic code, draining and releasing the pool before the invocation of NSApplicationMain.

Williham Totland
more likely a new thread with performSelectorInBackground
Jared P
While my original question had more to do with breakpoints, I am still tangled in this, as well. Now that I'm actually breaking, I see the following stack, and as you can see, I have an auto release pool around my NSApplicationMain and am still getting NSNoAutoreleasePool errors at runtime, with none of my code (outside of main) being executed:http://not-included.net/gfx/stupid/NSNoAutoReleasePool.pngAn aside about the auto release pool: why's this necessary? Shouldn't the main run loop's auto release pool handle this?
Tyrus
Another breadcrumb, this also prints after every "no pool in place" error. Reverted any recent changes, and it still shows up; I guess I just didn't notice before:>*** attempt to pop an unknown autorelease pool (0x89ac00)
Tyrus
Ah. Well, the autoreleasepool should not be around `NSApplicationMain()`. That particular functions handles its own pools.
Williham Totland
+1  A: 

It sounds like you're using Cocoa in a thread somewhere and not wrapping the thread body with an autorelease pool. You probably don't need to use breakpoints to find this. Are you doing any detachNewThreadSelector?

Ken Aspeslagh
The breakpoints did start working eventually (went and unchecked "load symbols lazily" checkbox after this ordeal... it's something I forget with every fresh install; I wish that wasn't the default).The issue seems to be more that the graphics library I'm using (SFML) starts its own run loop inside of my existing run loop when I call its draw and update calls from a timer (doing this so I don't block native UI elements). This confuses Cocoa and the debug, but my memory usage isn't exploding like I'd expect it to, so perhaps this is something I can get away with for this (internal dev tool).
Tyrus
This solved the problem for me. Inside the method (selector) that I was calling with performSelectorInBackground I had to wrap the body in an NSAutoreleasePool.
Mark Thistle