Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is an autorelease pool necessary if I'm not creating autoreleased objects?

I mean, if I were absolutely certain I wasn't creating any autoreleased objects, then of course it wouldn't. My real concern is if there's anything else under the hood I don't understand. I have a background thread that calls a function. Must I always create an autorelease pool anyway?

- (void)someFuncOnABackgroundThread
{
    //don't seem to need this. no leaks found
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    //do something that doesn't create any objects, or only use alloc/init/release

    NSString* str = [[NSString alloc] init];
    [str release];
    [pool drain];
}
like image 884
akaru Avatar asked Feb 21 '11 04:02

akaru


2 Answers

Yep! You have to. You might be calling a function that's internally using autorelease pools, so you never really know if you're using or not any autorelease.

Good luck!

like image 88
Gonzalo Larralde Avatar answered Sep 28 '22 07:09

Gonzalo Larralde


ultimately, it depends on the interfaces you're using in the implementation.

example 1

if you're interacting with Foundation or other objc types, you should. without question.

to answer specific to the example you've posted: definitely create one in this case -- NSString apis should assume an autorelease pool is in place.

example 2

if you're dealing entirely with apis in libc, there is no need.

bottom line

  • it can take a lot of time to understand where it's necessary (or not).

  • implementations can change, and they could introduce autoreleased objects.

  • you should guarantee a leak is never introduced, especially for such a simple reason.

  • it's a simple problem to overcome: if in doubt, create one.

like image 37
justin Avatar answered Sep 28 '22 05:09

justin