Review request for MACOSX_PORT-176: AWT Splashscreen support
Anthony Petrov
anthony.petrov at oracle.com
Thu Dec 15 06:40:50 PST 2011
On 12/15/11 07:39, Mike Swingler wrote:
> On Dec 12, 2011, at 7:19 AM, Anthony Petrov wrote:
>
>>> Also, the QueuingApplicationDelegate should hold onto it's own NSMutableArray and real delegate as ivars, not global statics.
>>
>> I agree, and I made the queue an instance variable. However, as soon as I'm trying to access an ivar from a block, I get crashed. So I left the realDelegate static.
>
> Well, that's your first indication that something is wrong with the memory management. The ivar should be properly retained and released (converting it to an @property with an @sythesize can help with that), and the "self" should be retained by the block when it is copied to the callstack of the AppKit thread, and subsequently released when the block is finished.
I assume that when I create a block, it retains 'self' reference to the
outer object automatically, right? Moreover, I've even tried to do
something like this:
QAD qad = self;
[... addObject:^(){
// use 'qad' instead of 'self' in the block
}];
with no luck.
I can't retain the ivar when I create the block since the realDelegate
becomes known only later. But if my previous assumption is correct, then
the block (I would assume) could access the ivar through the previously
retained reference to 'self' with ease. (and certainly, the reference to
realDelegate itself isn't released during executing the block). So why
would it crash then? Note that it crashes when just reading the value of
the ivar, like fprintf(..., (void*)(self->realDelegate)); - boom, it
crashed! You don't even need to try calling a selector from it - you
won't be able to read the ivar itself in the first place.
I don't see how using @property/@synthesize might help with this issue.
--
best regards,
Anthony
More information about the macosx-port-dev
mailing list