Re: Garbage collection - was Beginner with Cocoa
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