On Sep 3, 2009, at 11:47 AM, Jens Alfke wrote:
On Sep 3, 2009, at 11:40 AM, Scott Andrew wrote:
I could have sworn in either the apple docs (or one of the cocoa books, maybe this board). I maybe thinking of the general rule that you don't own the object until you retain it and its only valid or the within the method that its recieved. My bad.

Here's an example of a return value that isn't autoreleased:

- (Foo*) foo {
        static Foo* sharedFoo;
        if (!sharedFoo) sharedFoo = [[Foo alloc] init];
        return _sharedFoo;
}

Something similar is exactly what happens in the original code. On Snow Leopard at least, both NSDictionary and NSArray have optimizations for the "empty immutable collection" case. In both classes there's a single shared instance that lives forever, so it won't be destroyed even after every retain count that you are responsible for has been released.

Try this:

{
    NSDictionary *di = [[NSDictionary alloc] init];
    NSArray      *ar = [di allKeys];
    NSDictionary *di2 = [[NSDictionary alloc] init];
    NSArray      *ar2 = [di allKeys];

    NSLog(@"di %p, di2 %p", di, di2);
    NSLog(@"ar %p, ar2 %p", ar, ar2);
}

You'll see that there's only one NSDictionary object and one NSArray object, even though you called +alloc twice.

Then try your original test with a non-empty NSDictionary. You'll see the memory management behave more like you expect. (Of course, `[ar retainCount]` is likely to crash if called after `ar` is deallocated.)


--
Greg Parker     gpar...@apple.com     Runtime Wrangler


_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to