Re: Correct memory management in -awakeAfterUsingCoder: ?
Re: Correct memory management in -awakeAfterUsingCoder: ?
- Subject: Re: Correct memory management in -awakeAfterUsingCoder: ?
- From: Jonathan Hess <email@hidden>
- Date: Mon, 4 May 2009 22:44:29 -0700
Hey Graham -
I believe the expectation is that you return a retained instance from
an override of awakeAfterUsingCoder:. This isn't clearly documented,
so I would recommend filing a documentation bug.
Good Luck -
Jon Hess
On May 4, 2009, at 9:45 PM, Graham Cox wrote:
I am trying to track down an over-release bug.
It looks like I'm doing something wrong in -awakeAfterUsingCoder:
which leads to an object being insufficiently retained.
I have two objects, A and B. A loads B from an archive within -
initWithCoder: while dearchiving and retains it. When B is
dearchived, it can be replaced by another object by its -
awakeAfterUsingCoder: method. If I detect that B should be replaced,
I release the current B as per the documentation and return the
replacement without doing anything regarding retain or release on
it, as it's already retained by the code that supplied it.
Subsequently it is this object that is over-released.
If I retain the object before returning it in -
awakeAfterUsingCoder:, the problem goes away, but this appears to
violate normal memory management rules, so it's not clear that this
is the correct solution. The documentation doesn't explicitly say
anything about this either.
Rough outline of the code:
// in object A:
- (id) initWithCoder:(NSCoder*) coder
{
ivarB = [[coder decodeObjectForKey:@"B"] retain];
}
// in object B:
- (id) awakeAfterusingCoder:(NSCoder*) coder
{
id replacement = [someStorageLibrary objectSimilarTo:self]; //
<someStorageLibrary> is retaining <replacement>
if( replacement )
{
[self release]; // immediate release as per documentation
return replacement; //<--- to retain or to not retain, that
is the question...
}
else
{
[someStorageLibrary addObject:self];
return self;
}
}
tia,
--Graham
_______________________________________________
Cocoa-dev mailing list (email@hidden)
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:
This email sent to email@hidden
_______________________________________________
Cocoa-dev mailing list (email@hidden)
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:
This email sent to email@hidden