The easiest way to ensure problem free usage of the bridge is to ensure that the delegate methods that you use don't use C arrays as arguments or return values and don't use variadic signatures ("..."). Futhermore ensure that all pass-by-reference arguments (such as the commonly used "NSError**" argument) are marked up with "in", "out" or "inout" to indicate in which direction values are passed. This ensures that the bridge can get all information it needs from the Objective-C runtime.
There are two options to pass a preconstructed object to Python code:
Create a class method that returns the object
Use the PyObjC API to create the python proxy for the Objective-C object.
The latter uses an internal PyObjC API (also used by the framework wrappers) and could break in future versions of PyObjC. That said, I don't have active plans to break the solution I describe here.
First ensure that the right version of "pyobjc-api.h" and "pyobjc-compat.h" are available for the Objective-C compiler.
Use #include "pyobjc-api.h"
to make the API available.
Call "PyObjC_ImportAPI" after initialising the Python interpreter, but before you use any other PyObjC function.
Use "pyValue = PyObjC_IdToPython(objcValue)" to create a Python representation for an Objective-C object.