88// Import Cocoa headers
99#import < Cocoa/Cocoa.h>
1010
11+ // Note: This file assumes ARC (Automatic Reference Counting) is enabled
12+ // for proper memory management of Objective-C objects.
13+
1114// Forward declarations - moved to global scope
1215@interface MenuItemTarget : NSObject
1316@property (nonatomic , assign ) nativeapi::MenuItemID itemId;
@@ -175,6 +178,9 @@ - (void)menuDidClose:(NSMenu *)menu {
175178
176179 ~Impl () {
177180 if (target_) {
181+ // Remove target and action to prevent callbacks after destruction
182+ [ns_menu_item_ setTarget: nil ];
183+ [ns_menu_item_ setAction: nil ];
178184 target_ = nil ;
179185 }
180186 }
@@ -248,7 +254,7 @@ - (void)menuDidClose:(NSMenu *)menu {
248254void MenuItem::SetIcon (const std::string& icon) {
249255 pimpl_->icon_ = icon;
250256
251- NSImage * image = nullptr ;
257+ NSImage * image = nil ;
252258
253259 // Check if the icon is a base64 string
254260 if (icon.find (" data:image" ) != std::string::npos) {
@@ -258,8 +264,9 @@ - (void)menuDidClose:(NSMenu *)menu {
258264 std::string base64Icon = icon.substr (pos + 7 );
259265
260266 // Convert base64 to NSData
267+ NSString * base64String = [NSString stringWithUTF8String: base64Icon.c_str ()];
261268 NSData * imageData = [[NSData alloc ]
262- initWithBase64EncodedString: [ NSString stringWithUTF8String: base64Icon. c_str ()]
269+ initWithBase64EncodedString: base64String
263270 options: NSDataBase64DecodingIgnoreUnknownCharacters ];
264271
265272 if (imageData) {
@@ -281,6 +288,9 @@ - (void)menuDidClose:(NSMenu *)menu {
281288 [image setSize: NSMakeSize (16 , 16 )]; // Standard menu item icon size
282289 [image setTemplate: YES ];
283290 [pimpl_->ns_menu_item_ setImage: image];
291+ } else {
292+ // Clear the image if no valid icon is provided
293+ [pimpl_->ns_menu_item_ setImage: nil ];
284294 }
285295}
286296
@@ -449,6 +459,8 @@ - (void)menuDidClose:(NSMenu *)menu {
449459
450460 ~Impl () {
451461 if (delegate_) {
462+ // Remove delegate to prevent callbacks after destruction
463+ [ns_menu_ setDelegate: nil ];
452464 delegate_ = nil ;
453465 }
454466 }
@@ -604,9 +616,13 @@ - (void)menuDidClose:(NSMenu *)menu {
604616 pressure: 1.0 ];
605617
606618 pimpl_->visible_ = true ;
607- // Create a dummy view to avoid the nil warning
608- NSView * dummyView = [[NSView alloc ] init ];
609- [NSMenu popUpContextMenu: pimpl_->ns_menu_ withEvent: event forView: dummyView];
619+
620+ @autoreleasepool {
621+ // Create a dummy view to avoid the nil warning
622+ NSView * dummyView = [[NSView alloc ] init ];
623+ [NSMenu popUpContextMenu: pimpl_->ns_menu_ withEvent: event forView: dummyView];
624+ }
625+
610626 pimpl_->visible_ = false ;
611627
612628 return true ;
0 commit comments