On Mon, Mar 24, 2008 at 9:12 AM, Bill Cheeseman <[EMAIL PROTECTED]> wrote:
> on 2008-03-24 11:30 AM, colo at [EMAIL PROTECTED] 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 PROTECTED]
_______________________________________________

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 [EMAIL PROTECTED]

Reply via email to