Cocoa/ListView: fix and improve memory management

This commit is contained in:
rich2014 2024-07-17 21:07:19 +08:00
parent 87735b5f81
commit 400b5fb630
2 changed files with 28 additions and 1 deletions

View File

@ -19,6 +19,8 @@ type
TCocoaCollectionItem = objcclass(NSCollectionViewItem)
public
procedure loadView; override;
procedure prepareForReuse; message 'prepareForReuse';
procedure dealloc; override;
end;
{ TCocoaCollectionItemView }
@ -145,7 +147,7 @@ var
item: NSCollectionViewItem;
items: NSMutableArray Absolute Result;
begin
Result:= NSMutableArray.new;
Result:= NSMutableArray.new.autorelease;
visibleRect:= cv.visibleRect;
for item in cv.visibleItems do begin
if NSIntersectsRect( item.view.frame, visibleRect ) then
@ -181,6 +183,22 @@ begin
self.setView( itemView );
end;
procedure TCocoaCollectionItem.prepareForReuse;
begin
self.view.removeFromSuperview;
end;
procedure TCocoaCollectionItem.dealloc;
begin
self.imageView.removeFromSuperview;
self.textField.removeFromSuperview;
self.view.removeFromSuperview;
self.imageView.release;
self.textField.release;
self.view.release;
inherited dealloc;
end;
{ TCocoaCollectionItemView }
procedure TCocoaCollectionItemView.drawRect(dirtyRect: NSRect);

View File

@ -219,6 +219,8 @@ type
function lclGetCallback: ICommonCallback; override;
procedure lclClearCallback; override;
function lclContentView: NSView; override;
public
procedure dealloc; override;
public
procedure setLclListView( lclListView: TCustomListView ); message 'setLclListView:';
procedure setViewStyle( viewStyle: TViewStyle ); message 'setViewStyle:';
@ -2090,6 +2092,7 @@ procedure TCocoaListView.releaseControls;
begin
if not Assigned(_backendControl) then
Exit;
FreeAndNil( _WSHandler );
_scrollView.removeFromSuperview;
_scrollView.setDocumentView( nil );
_scrollView.release;
@ -2128,6 +2131,12 @@ begin
Result:= documentView;
end;
procedure TCocoaListView.dealloc;
begin
self.releaseControls;
inherited dealloc;
end;
procedure TCocoaListView.setLclListView(lclListView: TCustomListView);
begin
_lclListView:= lclListView;