Re: Objects cross calls
Re: Objects cross calls
- Subject: Re: Objects cross calls
- From: Mont Rothstein <email@hidden>
- Date: Mon, 23 Jan 2006 08:01:24 -0800
First, just so you know, this problem (where two objects retain each other)
is generally referred to as a retain cycle.
You are on the right track with deleteFruit:
You always want to wrap you instance variables (like fruit) in accessor
methods. No code, other than the accessor methods, should ever directly
access instance variables. (I use an underscore in front of instance
variables to help remind myself not to access them directly, though I think
Apple may discourage this for some silly reason).
So, if you want to delete all fruit then create a deleteAllFruit method and
a removeFruits: method on the basket. You can then deal with your retain
cycles without having to worry about some other random bit of code screwing
things up for you.
I'm sure there is a name for the accessor method pattern but someone more
learned that I would have to tell you what it is.
-Mont
On 1/23/06, Lorenzo <email@hidden> wrote:
>
> The problem is that I cannot delete the fruit from the basket in the fruit
> dealloc method this way
>
> - dealloc
> {
> [basket removeFruit:self];
> [super dealloc];
> }
>
> in fact when some part of my app deletes a fruit, e.g.
>
> [fruits removeObjectAtIndex:4];
>
> since the retain count was 2 before the removeObjectAtIndex call,
> the dealloc method doesn't get called.
> I should remove a fruit with my own method like
>
> - (void)deleteFruit:(int)index
> {
> aFruit = [fruits objectAtIndex:index];
> [[aFruit basket] removeFruit:aFruit];
> [fruits removeObjectAtIndex:index];
> }
>
> This begins to be complicated if you think that some call could remove all
> the fruits or even release the fruits array like these calls
>
> [fruits removeAllObjects];
> [fruits release];
>
> What to do in case of these 2 calls above?
> I think there should be a more efficient method than cross-connecting the
> 2
> objects. I though about relational database and record IDs but I am afraid
> that is not the right approach.
> What's about creating an array with simple pointers of the fruits?
>
>
>
> Best Regards
> --
> Lorenzo
> email: email@hidden
>
> > From: Pontus Ilbring <email@hidden>
> > Date: Mon, 23 Jan 2006 14:51:33 +0100
> > To: Lorenzo <email@hidden>
> > Cc: email@hidden
> > Subject: Re: Objects cross calls
> >
> > On 1/23/06, Lorenzo <email@hidden> wrote:
> >> Hi,
> >> how should I work with objects referring each other in a cross way?
> >
> > Very, very carefully, that's how. You seem to have figured that out
> already.
> >
> > For your situation I would suggest a very simple solution. When you
> > remove an object from the fruits array, tell -all- baskets to remove
> > it as well. There's no harm in trying to remove an object from an
> > array which doesn't contain it.
> >
> > If you don't need them ordered then you should also consider changing
> > the baskets to use sets instead of arrays, as they are much more
> > efficient when you want to remove arbitrary objects.
>
> _______________________________________________
> Do not post admin requests to the list. They will be ignored.
> Cocoa-dev mailing list (email@hidden)
> Help/Unsubscribe/Update your Subscription:
>
>
> This email sent to email@hidden
>
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Cocoa-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden