Objective-C memory model

Posted by TofuBeer on Stack Overflow See other posts from Stack Overflow or by TofuBeer
Published on 2010-04-19T18:56:08Z Indexed on 2010/04/19 19:13 UTC
Read the original article Hit count: 465

Filed under:
|

I am attempting to wrap my head around one part of the Objective-C memory model (specifically on the iPhone, so no GC). My background is C/C++/Java, and I am having an issue with the following bit of code (also wondering if I am doing this in an "Objective-C way" or not):

- (NSSet *) retrieve
{
    NSMutableSet *set;

    set = [NSMutableSet new];
    // would normally fill the set in here with some data

    return ([set autorelease]);
}

- (void) test
{
    NSSet *setA;
    NSSet *setB;

    setA = [self retrieve];
    setB = [[self retrieve] retain];

    [setA release];
    [setB release];
}

start EDIT

Based on comments below, the updated retrieve method:

- (NSSet *) retrieve
{
    NSMutableSet *set;

    set = [[[NSMutableSet alloc] initWithCapacity:100] autorelease];
    // would normally fill the set in here with some data

    return (set);
}

end EDIT

The above code gives a warning for [setA release] "Incorrect decrement of the reference count of an object is not owned at this point by the caller".

I though that the "new" set the reference count to 1. Then the "retain" call would add 1, and the "release" call would drop it by 1. Given that wouldn't setA have a reference count of 0 at the end and setB have a reference count of 1 at the end?

From what I have figured out by trial and error, setB is correct, and there is no memory leak, but I'd like to understand why that is the case (what is wrong with my understanding of "new", "autorelease", "retain", and "release").

© Stack Overflow or respective owner

Related posts about iphone

Related posts about objective-c