Hi Eskimo,
ok, so I have results. I now know things that I did not know earlier.
if you release an object that you are observing, the system will give you a very detailed and elaborate error message in the output.
But... if you release the observer instead of the observed, you get no such error. the app just gets a memory error at the point in your app where that notification is sent out. There is no elaborate and helpful error message. Eskimo, what you noticed in the Back trace is literally the only thing I was certain of at the start of this process. (so I hope you can understand why I really did laugh when i got that advice.)
The BackTrace did confirm that it was a notification error (thank you QuiceyMorris, that was your pickup there.)
But we were already on the path to untangling that knot in the process I was already chewing on with Claude31.
I had a weekend of "Not thinking about this." And came back to it this monday morning, with a different approach. I will never be able to make sense out of BackTrace, without some kind of resource i can read, that explainsd what and why (and if you have one I am more than willing to get it and read it... I read the book on the old Pascal debugger MPC? for mac os 7 when I was a preteen, so its not like I'm not interested, the resources just don't seem to exist,) but my understanding of what i wrote, and what we've already confirmed should be enough to find the 8Ball. My error is based on the need to balance setting up and releasing observers. I have to have at least 1 unbalanced addObserver in my code. And I can know which objects are being released.
so I put breakpoints at every single addObserver/removeObserver in the classes that I suspected were hiding the 8Ball. and then for each addObserver, I added it to a checklist in a Numbers document for each individual object. Then I went through the steps to put the app in the failure mode, and checked off each remove observer call. It took a few tries because I learned that many of my addObserver/removeObserver calls are happening in ancestors of my class.
and here is the result: my classes, are part of a class hierarchy, and one of the objects in the middle of one of those hierarchies, did not pass through a call to a method that released observation in an object that I was releasing.
so the common ancestor releases an observation of a common property.
my class, releases the observation of specific properties, and it calls : super.unload() (which is the method I use to release observation)
and a class somewhere in the between those two classes, did not call: super.unload()
so the common property observations were never released.
of course, this was all very far away from where I was looking. (on line 355 of
CNTestController.swift
) and my focus at the start of this, was on that line.
thank you all for your help. especially Caulde31.