It may be ancient but, IMHO, it should be fixed, at least for ARC. It is a major source of unnecessary retain cycles and the fix is simple. I went ahead and created a simple wrapper for NSTimer, as I originally described, and it works perfectly. I am going to file an enhancement request.
You¹re right. I have a strong C++ background which does color my thinking about how things should work. In my main window controllers, I use ³wakeup² calls to other controllers, rather then using ³awakeFromNib², because the latter is unpredictable as to calling order. Maybe I should similarly add ³shutDown² calls so I can finalize and release contained controllers in a prescribed order. I might even add a protocol with those two methods. On 1/12/13 2:33 PM, "Kyle Sluder" <k...@ksluder.com> wrote: > On Jan 12, 2013, at 12:16 PM, Gordon Apple <g...@ed4u.com> wrote: > >> Re: Could somebody please fix NSTimer? And just how does one go about doing >> that? The only way I can see is to use an owner¹s dealloc to call something >> like ³wouldLikeToDealloc² on the owned object. > > Retain/release is just an implementation of a pattern. You can implement it > yourself, or use one of the other existing implementations the framework > provides for you: -viewDidMoveToSuperview, -windowWillClose, etc. > >> From the literature, it appears that NSTimer is the main offender in this >> regard. > > NSTimer is something like twenty years old, but it is also decently > documented. The run loop maintains a strong reference to the timer. The timer > maintains a strong reference to its target. The chain is broken when the timer > is invalidated. > >> I frequently use generic NSViewControllers and NSWindowControllers which have >> no link to the controller containing the timer. > > The good thing about writing application code, rather than framework code, is > that you can fix this problem and your solution can be both specific and > correct. > > Meanwhile, you have no guarantee that some random piece of framework code > hasn't retained your window controller or view controller, and now all of a > sudden the timer you installed elsewhere is still firing at your view > controllers but the model objects have been deallocated > > This isn't C++. RAII is not a valid pattern in Cocoa. Do not use object > lifecycle to manage interactions between app components. Instead, make the > targets of your timers aware enough of their use that they can signal for the > timer to be invalidated at the appropriate time. > > --Kyle Sluder > _______________________________________________ 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