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]