The reason for using __del__ is because cffi seemed to be limiting its call to the “destroy” callback to only happen once for a given cdata address. This would make sense for memory management but not reference counting management. But this is a just my best guess and the exact details are beyond my current understanding of cffi. Feel free to repurpose some of the test code I wrote for checking the cairo reference counts if it is useful. And yes, it should really just turn into a simple assignment.