you can still use RetainObject. just cast to IROObjectRetainer:
function TRobotService2.GetLoggedUsers():TUserInfoArray;
begin
Result := BorrowLoggedInUsers();
(self as IROObjectRetainer).RetainObject(Result);
end;
yes
our code destroys only var and out parameters that aren’t retained, so usage of RetainObject with newuser isn’t needed.
destructor TROObjectDisposer.Destroy;
var
i: Integer;
l_retainer: IROObjectRetainer;
begin
if Supports(fService, IROObjectRetainer, l_retainer) then begin
// Only destroyes the var and out params the service is not retaining
for i := Count - 1 downto 0 do
if not l_retainer.IsRetained(Items[i]) then
FreeOrDisposeOf(Items[i]);
l_retainer := nil;
end
else begin
for i := 0 to Count - 1 do
FreeOrDisposeOf(Items[i]);
end;
fService := nil;
inherited;
end;