• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Garbage collection - was Beginner with Cocoa
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Garbage collection - was Beginner with Cocoa


  • Subject: Re: Garbage collection - was Beginner with Cocoa
  • From: "Clark Cox" <email@hidden>
  • Date: Mon, 24 Mar 2008 09:45:24 -0700

On Mon, Mar 24, 2008 at 9:12 AM, Bill Cheeseman <email@hidden> wrote:
> on 2008-03-24 11:30 AM, colo at email@hidden wrote:
>
>  > In Ruby GC just works dandy without thought. Why is it so different in
>  > Cocoa Obj2.0?
>
>  My main issue is how to know exactly when to declare instance variables weak
>  or strong.

You rarely need to worry about weak instance variables.

> There seem to be some subtleties in that area that I don't yet
>  understand. On the other hand, it appears that these issues will rarely be
>  encountered, and that the simple rules of thumb in the documentation will
>  almost always be enough.

Indeed; it is very rare that you need to declare an instance variable
weak. Most of the reasons that, under retain/release, one might
intentionally not retain an instance variable (conceptually similar to
"weak" under GC) are already handled by the collector. That is, under
retain/release, when making a parent/child relationship, one would
have to be careful to only retain *one* of the pointers defining the
relationship in order to avoid circular references.

Under GC, there is no need to worry about this, as the collector is
smart enough to recognize that a pair of objects (or a whole tree of
objects) can be collected, as long as nothing outside of that tree has
references to any of the objects inside of it.

For example, under retain/release:
  @class Child;
  @interface Parent : NSObject { Child *child; }
  @property (retain) Child *child;
  @end

  @interface Child : NSObject { Parent *parent; }
  //We can't retain the parent pointer without introducing a circular reference
  @property (assign) Child *child;
  @end

  @implementation Parent
  @dynamic child;

  -(void)dealloc {
    self.child = nil;
    [super dealloc];
  }

  -(void)setChild:(Child*)c {
    if(c != child) {
      child.parent = nil;
      c.parent     = self;
      [child release];
      child = [c retain];
    }
  }

  -(Child*)child {
    return child;
  }

  @end

  @implementation Child
  @synthesize parent;
  @end

Under GC, this becomes (note that there is no need for "weak"):
  @class Child;
  @interface Parent : NSObject { Child *child; }
  @property Child *child;
  @end

  @interface Child : NSObject { Parent *parent; }
  @property Child *child;
  @end

  @implementation Parent
  @dynamic child;

  -(void)setChild:(Child*)c {
    if(c != child) {
      child.parent = nil;
      c.parent     = self;
      child = c;
    }
  }

  -(Child*)child {
    return child;
  }

  @end

  @implementation Child
  @synthesize parent;
  @end


--
Clark S. Cox III
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

References: 
 >Re: Garbage collection - was Beginner with Cocoa (From: colo <email@hidden>)
 >Re: Garbage collection - was Beginner with Cocoa (From: Bill Cheeseman <email@hidden>)

  • Prev by Date: Re: Textview is overwriting itself
  • Next by Date: Re: Beginner with Cocoa
  • Previous by thread: Re: Garbage collection - was Beginner with Cocoa
  • Next by thread: Re: Garbage collection - was Beginner with Cocoa
  • Index(es):
    • Date
    • Thread