[Drawkit] bug?
Graham Cox
graham.cox at bigpond.com
Fri Aug 8 07:24:29 PDT 2008
Well... doesn't look like a bug in DK as such. Hard to say exactly why
this cropped up, but you shouldn't be releasing your controllers
anyway - they are not typically yours to release.
There are two scenarios that lead to the deallocation of a tool
controller. 1. the view that the controller is associated with goes
away. This might happen because the window on which it lives has
closed, or you removed it from a superview, etc. In that case, the
view removes the controller from the drawing which releases it. 2. The
drawing goes away. This might be because the document that owns it has
closed, and all of the windows and views associated with it are
getting torn down. In that case, the drawing releases all of the
controllers it might have. It doesn't matter whether the view or the
drawing goes away first - the right thing gets done. (This is well-
tested because getting this to work properly - i.e. not leak, and not
have retain cycles - for all the different cases took a lot of testing!)
If some other object has retained the tool controller other than its
proper owner (the drawing) then you could run into problems because a
"naked" tool controller that is not attached to a drawing and/or a
view is not only going to be useless, but may have stale weak refs to
objects that might have disappeared. You're on a fast-track to crash
city. So don't retain tool controllers - just let them work as they
are supposed to.
The problem could also be that you somehow broke a connection between
a view and its controller without removing the controller from the
drawing (normally this won't happen if you just leave things to run
their course) and when the drawing was dealloced (on doc closure) it
asks all of its controllers to close any editing sessions that may be
open. At that point if the controller is in a bad state then it could
also be trying to reference a non-existent view. Normally that will
crash but just maybe the ref now points to an array instance in memory
and that's why you are getting this message. The advice is the same -
just let tool controllers work normally.
None of this precludes overriding or subclassing a tool controller,
but it's important not to do this in order to interfere with its
normal ownership and lifetime mechanisms. Because of the need for weak
references in both directions within a tool controller, this is one of
the more sensitive and subtle classes when it comes to memory
management.
cheers, Graham
On 8 Aug 2008, at 12:46 pm, James Maxwell wrote:
> I added a dealloc to my DKDrawingDocument subclass, and a strange
> error appeared:
>
> *** -[NSCFArray exitTemporaryTextEditingMode]: unrecognized selector
> sent to instance 0x15ed5c90
>
> It pops up when I release my DKToolController subclass - in
> particular, it's when I close a drawing that has been read from
> disk. I worked around it by handling my controllers in a much better
> way, and thus avoiding the need to release them in a dealloc, but I
> thought I'd post the error anyway, as it doesn't seem like it should
> be possible for this selector to be sent to a NSCFArray (should only
> be sent to controllers, from what I can tell).
>
> J.
> _______________________________________________
> Drawkit mailing list
> Drawkit at lists.apptree.net
> http://lists.apptree.net/listinfo.cgi/drawkit-apptree.net
More information about the Drawkit
mailing list