'Using Apple autorelease pools without Objective-C
I am developing an application that needs to work on Linux, Windows and Mac OS X. To that purpose, I am using C++ with Qt.
For many reasons, on Mac OS X, I need to use CoreFoundation functions (such as CFBundleCopyBundleURL) that creates core objects that need to be released with CFRelease. But doing so generate a lots of these warnings:
*** __NSAutoreleaseNoPool(): Object 0x224f7e0 of class NSURL autoreleased with no pool in place - just leaking
All the code I've seen concerning these autorelease pools are written in Objective-C. Does anybody know how to create/use autorelease pools in C or C++?
Solution 1:[1]
Solution 2:[2]
All the code I've seen concerning these autorelease pools are written in Objective-C.
Because autorelease pools only exist in Cocoa and Cocoa Touch.
Does anybody know how to create/use autorelease pools in C or C++?
The only way to do it is to wrap Cocoa code (the creation and drainage of a pool) in a pair of C functions. Even then, that is an ugly hack that merely masks a deeper problem.
What you really should do is find out exactly what is autoreleasing objects (Instruments will help you do this) and either fix it or excise it.
Solution 3:[3]
The error you get is caused by something somewhere creating an Objective-C class (NSURL) using the convenience static method [NSURL urlWithString:]. Methods that return objects that aren't "alloc" or "copy" should put the object inside an autorelease pool before returning the object. And since you haven't setup one up it'll just crash or leak memory.
I'm not sure exactly how to fix this but you need to put something like:
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
doStuff();
[pool release];
somewhere in your code.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Walter |
| Solution 2 | Peter Hosey |
| Solution 3 | wm_eddie |
