Cocoa: fix possible nil pointer crash created by prior memory leak cleanup, issue #40167

This commit is contained in:
David Jenkins 2023-03-21 16:33:28 -05:00 committed by Maxim Ganetsky
parent 0deadb0dbb
commit edaa81c763

View File

@ -205,25 +205,25 @@ var
// when the tracking loop is over // when the tracking loop is over
// //
// See topic: https://forum.lazarus.freepascal.org/index.php/topic,56419.0.html // See topic: https://forum.lazarus.freepascal.org/index.php/topic,56419.0.html
menuTrack : TList = nil; menuTrack : NSMutableArray;
procedure MenuTrackStarted(mn: NSMenu); procedure MenuTrackStarted(mn: NSMenu);
begin begin
if not Assigned(menuTrack) then menuTrack:=TList.Create; if menuTrack = nil then menuTrack := NSMutableArray.alloc.init;
menuTrack.Add(mn); menuTrack.addObject(mn);
end; end;
procedure MenuTrackEnded(mn: NSMenu); procedure MenuTrackEnded(mn: NSMenu);
var var
i : integer; i : integer;
begin begin
if not Assigned(menuTrack) then if menuTrack = nil then
// it's possible if popup menu was used, without mainmenu in the app // it's possible if popup menu was used, without mainmenu in the app
Exit; Exit;
i := menuTrack.IndexOf(mn); i := menuTrack.indexOfObject(mn);
if i>=0 then if i >= 0 then
menuTrack.Delete(i); menuTrack.removeObjectAtIndex(i);
end; end;
procedure MenuTrackCancelAll; procedure MenuTrackCancelAll;
@ -231,13 +231,13 @@ var
i : integer; i : integer;
mn : NSMenu; mn : NSMenu;
begin begin
if not Assigned(menuTrack) then Exit; if menuTrack = nil then Exit;
for i:=menuTrack.Count-1 downto 0 do begin for i:=menuTrack.count - 1 downto 0 do begin
mn := NSMenu(menuTrack[i]); mn := NSMenu(menuTrack.objectAtIndex(i));
if Assigned(mn) then if Assigned(mn) then
mn.cancelTracking; mn.cancelTracking;
end; end;
menuTrack.Clear; menuTrack.removeAllObjects;
end; end;
function LCLMenuItemInit(item: NSMenuItem; const atitle: string; ashortCut: TShortCut): id; function LCLMenuItemInit(item: NSMenuItem; const atitle: string; ashortCut: TShortCut): id;
@ -1074,6 +1074,6 @@ initialization
finalization finalization
MenuTrackCancelAll; MenuTrackCancelAll;
if Assigned(menuTrack) then menuTrack.Free; if menuTrack <> nil then menuTrack.release;
end. end.