On 11 Mar 2012, at 08:01, Quincey Morris wrote: > On Mar 10, 2012, at 23:18 , Eric Wing wrote: > >> I don't disagree that finalizers are hard and need to be approached >> with great care. And I agree that all 4 of your points are valid. >> However, I think this description of the retain cycle problem might be >> a little over-dramatic. Retain cycles have always been a problem in >> classic memory management and are still a problem even under ARC. Yet >> there is over a decade's worth of code that managed to write code to >> the Cocoa framework and for the most part avoid retain cycles. With a >> simple scoped problem, well defined strategy, and some care, I think >> this is entirely doable. And if he were to go manual management or >> ARC, he has to avoid retain cycles anyway so he still has to design >> carefully. > > I think I'd put it this way: > > There's a difference between a retain cycle in a retain/release (RR) app and > a retain cycle introduced into a GC app by using CFRetain. > > In the first case, the app is architected so that cycles are manually broken > in cases where that's necessary. > > In the second case, the app was previously architected to *ignore* any > question of cycles, since normally they're irrelevant to GC. By using > CFRetain, the question is no longer irrelevant, and the app may need to be > re-architected, and the changes may not be local to the places where CFRetain > is explicitly used. On top of that, in a GC app, you aren't in control of all > of the code (you're using Cocoa frameworks, other frameworks and libraries, > whose internal use of references is unknown and unmanageable). > > At risk of making another sweeping generalization, I'd say that spending your > time on doing complicated things with finalization is a terrible waste of > resources. > > The finalization/resource-disposal problem is the *big* drawback to GC apps. > Retain cycles are the *big* drawback to ARC apps. Both of them require > considerable design and implementation effort to solve. In Jonathan's case, > using CGRetain would mean he has to solve *both* at the same time. If he > can't solve the finalization problem more directly, he'd probably be better > off re-architecting the app for ARC and just dealing with the cycles**. > > But, as I noted before, he could be lucky in using your suggestion. It might > be two small problems instead of two big problems. :)
I think both Eric an Quincey are making valid points. Unrestrained use of CFRetain/CFRelease in a GC app could certainly lead to trouble. It could also be used with restraint, what is probably what Eric had in mind. The category disposal counting solution that I proposed certainly works. It has some advantages: 1. Resource disposal isn't tied to the object lifetime so disposal is predictable. 2. It doesn't require any code in -finalize. The downsides are: 1. What is essential (in my case) an internal class resource management problem leaks out into the application space as I have to explicity manage the disposal count. 2. A failure to balance the disposal retain/release calls will leak data in temporary files - which may be a big deal depending on the content. My conclusion: 1. The CFRetain/CFRelease solution is elegant and will I think suffice for my admittedly simple scenario. 2. Under GC CFRetain/CFRelease use the GC ref counting mechanism so we are still working with the central GC memory management system. 3. I will be applying the retain/release to ivars which *should* never reference self so retain cycles should not be a problem. I agree with Quincey though that a complicated -finalize method is probably a bad -finalize method. Regards Jonathan Mitchell Mugginsoft LLP _______________________________________________ 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: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com