Re: [Pyobjc-dev] HelloWorld.py segfaults
Brought to you by:
ronaldoussoren
From: Jack J. <Jac...@cw...> - 2003-06-30 13:57:52
|
On Monday, Jun 30, 2003, at 15:42 Europe/Amsterdam, Chris Ryland wrote: >>> If you change the code to: >>> dgate = AppDelegate.alloc().init() >>> NSApp.setDelegate_(dgate) >>> >>> instead of 'NSApp.setDelegate_(AppDelegate.alloc().init())' the >>> example works as expected. > Uh-oh--can you explain to the uninitiates why these two code sequences > aren't identical? It's a refcounting issue. The variation with the "dgate" helper variable will keep the AppDelegate alive at least as long as the "dgate" variable exists, which is until the end of the program. The other variation would be identical if setDelegate_ was normal Python code (the refcount of the AppDelegate would be one lower, but still greater than zero). But ObjC refcounting works different than Python refcounting, and while usually the differences are not noticeable there are some exceptions. Apparently delegates are one such exceptions: the receiving class (NSApp) does not increment the refcount on its delegate. Therefore, when setDelegate_() returns the refcount on the AppDelegate will be decremented to zero, and the object will be garbage collected. -- Jack Jansen, <Jac...@cw...>, http://www.cwi.nl/~jack If I can't dance I don't want to be part of your revolution -- Emma Goldman |