On Jan 26, 2016, at 06:00 , Dave <d...@looktowindward.com> wrote: > > IOW, the autorelease will basically just be a NOP?
An autorelease is never a NOP. It’s a “release later”, not a “release if necessary”. Rather than trying to count or balance retains globally, I think it’s easier to think in terms of ownership (+1 references) and non-ownership (+0 references). An init method must provide an owned (+1) reference to the object it returns. The cache, of course, must have a +1 reference to the cached object, too. So, rewriting your code to account for things already discussed, and simplifying your cache into a simple static variable, you get something like this: > static id cachedObject; > > -(instancetype) initWithID:(NSString*) something > { > self = [super initWithSomething: something] // This ‘self’ is +1 > according to init semantics > if (self == nil) > return nil; > > id myCachedObject = cachedObject; // A +0 local reference > > if (myCachedObject == nil) > { > cachedObject = [self retain]; // The cache needs its own +1 > reference to keep the object alive until the cache is cleared > return self; // ‘self’ is still +1 according to init semantics: > this is unrelated to the retain in the previous line > } > > else > { > [self autorelease]; // The “temporary” self is being discarded, > so it needs to be released, eventually > return [myCachedObject retain]; // Returning a +1 reference > according to init semantics > } > } (It been years since I’ve actually *written* any MRR code, so I apologize in advance for any stupid errors.) If you do want to count retains, you’ll see that the object returned from this method, via either path, has a +2 retain count. That’s because +1 of that “belongs” to the caller, and you have no control over whether or when the caller does a corresponding release. The other +1 belongs to you, and is what keeps the cached object alive. _______________________________________________ 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: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com