Casey McDermott
2018-09-07 17:46:43 UTC
We need to link some of our C++ classes to a matching Cocoa class.
It's easy for Cocoa to reference C++ objects. Going the other way is harder.
We have been using a linker class that has a void pointer to the Obj-C object
in the C++ header. We then cast it to a Cocoa object in the Obj-C++ source.
For example, in the C++ header we have:
void *mCocoaPopupPtr = nil;
Then in the source:
void GSCocoaPopupLinker::setCocoaFieldVisible(const BOOL inValue)
{
if (mCocoaPopupPtr != nil)
{
GSPopupButton *cocoaPopup = (__bridge GSPopupButton *)mCocoaPopupPtr;
[cocoaPopup setHidden : !inValue];
}
}
Problem is, with ARC turned on, the pointer is never nil, so it crashes.
The void pointer somehow becomes an NSAtom instead of 0.
There's very little documentation on NSAtom, but it appears to be Apple's way to
use the excess bits in a 64-bit address to store class info.
Is there some other way to test for an invalid void pointer?
Thanks,
Casey McDermott
TurtleSoft.com
_______________________________________________
Cocoa-dev mailing list (Cocoa-***@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/gegs%40ml-in.narkive.net
This email sent to ***@ml-in
It's easy for Cocoa to reference C++ objects. Going the other way is harder.
We have been using a linker class that has a void pointer to the Obj-C object
in the C++ header. We then cast it to a Cocoa object in the Obj-C++ source.
For example, in the C++ header we have:
void *mCocoaPopupPtr = nil;
Then in the source:
void GSCocoaPopupLinker::setCocoaFieldVisible(const BOOL inValue)
{
if (mCocoaPopupPtr != nil)
{
GSPopupButton *cocoaPopup = (__bridge GSPopupButton *)mCocoaPopupPtr;
[cocoaPopup setHidden : !inValue];
}
}
Problem is, with ARC turned on, the pointer is never nil, so it crashes.
The void pointer somehow becomes an NSAtom instead of 0.
There's very little documentation on NSAtom, but it appears to be Apple's way to
use the excess bits in a 64-bit address to store class info.
Is there some other way to test for an invalid void pointer?
Thanks,
Casey McDermott
TurtleSoft.com
_______________________________________________
Cocoa-dev mailing list (Cocoa-***@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/gegs%40ml-in.narkive.net
This email sent to ***@ml-in