return statement inside nsautoreleasepool scope

2019-09-01 16:15发布

问题:

Lets say I have the below scenario:

- (void)someFunction:(id)param {

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSObject *objectA = [[NSObject alloc] init];
    [objectA doStuff];  // Don't need to release objectA because of the pool

    if (!someValue) {
        [pool release];   // Doubt here
        return;
    }

    NSObject *objectB = [[NSObject alloc] init];
    [objectB doStuff];  // Don't need to release objectB because of the pool

    [pool release];
}

Is it right to return from inside the pool block in this way?

回答1:

Short answer: yes.

Long answer: pool that is abandoned without explicit release is released when the autorelease pool in which it nests (usually current thread's top autorelease pool) is released.

Btw, this is wrong:

NSObject *objectA = [[NSObject alloc] init];
[objectA doStuff];  // Don't need to release objectA because of the pool

You still have to release allocated objects, either explicitly:

NSObject *objectA = [[NSObject alloc] init];
[objectA doStuff];
[objectA release];

or by adding them to autorelease pool:


NSObject *objectA = [[[NSObject alloc] init] autorelease];
[objectA doStuff];