Re: ARC and C++ structures
Re: ARC and C++ structures
- Subject: Re: ARC and C++ structures
- From: Tom Doan via Cocoa-dev <email@hidden>
- Date: Wed, 15 Sep 2021 08:35:41 -0500
- Priority: normal
Thanks. That did it. Interestingly, not only did the Applie Migration
tool not flag a potential problem, but the docs on NSWindow and
releaseWhenClosed don't even hint of it.
> Hi Tom,
>
> > On Sep 14, 2021, at 9:53 AM, Tom Doan via Cocoa-dev
> > <email@hidden> wrote:
> >
> > I have a multiple platform application (Windows, Mac, GTK) that is
> > primarily organized using C++ with Objective-C used for the
> > Mac-specific interface. I recently switched to use ARC (as we are
> > using Scintilla which recently switched to ARC). However, I am
> > getting a zombied release of an NSWindow instance. So far as I can
> > tell, the memory handling of this seemed to be fine pre-ARC.
> > Unfortunately, because it's an NSWindow, the Instruments output for
> > it has 100's of toolbox calls, so it's very hard to tell where the
> > extra release is. What should I be looking for?
> >
> > Just to describe this, there's an EWindow C++ structure which has
> > the NSWindow * as a member (under Mac OS; it's an HWND under Windows
> > and Widget under GTK). It's after the delete of the EWindow that
> > things go south. I'm assuming that ARC is putting in a release, but
> > I haven't really seen any good description of how ARC interacts with
> > C++. A release there seems fine---the question is where is the
> > earlier (apparently erroneous) release.
>
> ARC will insert code at the end of your C++ destructor to release any
> strong id members.
>
> One possible wrinkle is the default release-when-close behavior of
> NSWindow. By default, when an NSWindow is `-close`d (which can only
> happen once in its lifetime), AppKit sends it a `-release`. The idea
> is that this release balances the initial `+alloc`.
>
> However, this is somewhat incompatible with ARC, which doesn´t know
> about this special behavior and will attempt to insert its own release
> to balance the alloc.
>
> Here is an example of a program that works perfectly fine under MRR
> but crashes under ARC:
>
> #import <AppKit/AppKit.h>
>
> NSWindow *window;
>
> int main(void) {
> @autoreleasepool {
> window = [[NSWindow alloc]
> initWithContentRect:NSMakeRect(0., 0., 100.,
> 100.) styleMask:NSWindowStyleMaskTitled
> backing:NSBackingStoreBuffered defer:NO];
> [window makeKeyAndOrderFront:nil]; [window
> close]; window = nil;
> }
> }
>
> You can disable this behavior by changing the `releasedWhenClosed`
> property of the window to `NO`:
>
> [window setReleasedWhenClosed:NO];
>
> Matt
>
---
2717 Harrison St
Evanston, IL 60201
USA
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden