Re: ARC and C++ structures

2021-09-15 Thread Tor Arne Vestbø via Cocoa-dev


On 15 Sep 2021, at 17:39, Matt Jacobson 
mailto:mhjacob...@me.com>> wrote:



On Sep 15, 2021, at 11:21 AM, Tor Arne Vestbø 
mailto:tor.arne.ves...@qt.io>> wrote:


On 14 Sep 2021, at 16:33, Matt Jacobson via Cocoa-dev 
mailto:cocoa-dev@lists.apple.com>> wrote:

By default, when an NSWindow is `-close`d (which can only happen once in its 
lifetime),

Interesting. If the NSWindow is retained elsewhere, can it not be ordered in 
again? Appreciate any details you can provide :)

I was wrong about this detail.  The window can definitely be ordered in again, 
and any subsequent `-close` does *not* issue a `-release`, even if the window 
`isReleasedWhenClosed`.  (How confusing.)

Thanks for the clarification!

Cheers,
Tor Arne
___

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com


Re: ARC and C++ structures

2021-09-15 Thread Matt Jacobson via Cocoa-dev


> On Sep 15, 2021, at 11:21 AM, Tor Arne Vestbø  wrote:
> 
> 
>> On 14 Sep 2021, at 16:33, Matt Jacobson via Cocoa-dev 
>> mailto:cocoa-dev@lists.apple.com>> wrote:
>> 
>> By default, when an NSWindow is `-close`d (which can only happen once in its 
>> lifetime), 
> 
> Interesting. If the NSWindow is retained elsewhere, can it not be ordered in 
> again? Appreciate any details you can provide :)

I was wrong about this detail.  The window can definitely be ordered in again, 
and any subsequent `-close` does *not* issue a `-release`, even if the window 
`isReleasedWhenClosed`.  (How confusing.)

So ignore the parenthetical part, but do `setReleasedWhenClosed:NO` your 
windows.

Matt
___

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com


Re: ARC and C++ structures

2021-09-15 Thread Tor Arne Vestbø via Cocoa-dev


On 14 Sep 2021, at 16:33, Matt Jacobson via Cocoa-dev 
mailto:cocoa-dev@lists.apple.com>> wrote:

By default, when an NSWindow is `-close`d (which can only happen once in its 
lifetime),

Interesting. If the NSWindow is retained elsewhere, can it not be ordered in 
again? Appreciate any details you can provide :)

Cheers,
Tor Arne


___

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com


Re: ARC and C++ structures

2021-09-15 Thread Tom Doan via Cocoa-dev
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
> >  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 
> 
> 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 (Cocoa-dev@lists.apple.com)

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:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com


Re: ARC and C++ structures

2021-09-14 Thread Matt Jacobson via Cocoa-dev
Hi Tom,

> On Sep 14, 2021, at 9:53 AM, Tom Doan via Cocoa-dev 
>  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 

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

___

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com


ARC and C++ structures

2021-09-14 Thread Tom Doan via Cocoa-dev
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.

Tom Doan
Estima
---
2717 Harrison St
Evanston, IL 60201
USA

___

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com