There was an additional crashing issue: another version of the same problem when an object has gone out of scope in the python context when it is accessed in the objc context.
I need to re-inforce the understanding that just because a python object like a ui.View is technically placed in a view hierarchy, or otherwise connected to the objc world, the underlying objc instance of a UIView is not in any way holding a strong reference to that python object, and I think vice-versa.
So creating a local ui.View instance inside a method, and then adding that view to a purely objc view hierarchy, will not preserve the python object after it goes out of scope. So a later attempt to access the python object will segfault.
e.g.:
import ui
import objc_util
class X(object):
def buttonAction(self, sender):
print sender
def demoCrash(self, sender):
b2 = ui.Button()
b2.frame = (0,0,200,50)
b2.title = "Crash?"
b2.action = self.buttonAction
v2 = ui.View()
v2.frame = (0,0,200,50)
v2.background_color = (1.0,1.0,1.0,1.0)
v2.objc_instance.addSubview(b2)
v2.present(style="sheet")
v = ui.View()
v.frame = (0,0,400,400)
v.background_color = (1.0,1.0,1.0,1.0)
x = X()
b = ui.Button()
b.title = "Show"
b.frame = (0,0,100,30)
b.center = (v.width*0.5,v.height*0.5)
b.action = x.demoCrash
v.add_subview(b)
v.present(style="sheet")
should have been obvious, but my code was more complex and hid what was happening.