FormCreate 加一條 或者在project里加上,就是fastmm
ReportMemoryLeaksOnShutdown:=true;
Application.Initialize;
Application.MainFormOnTaskbar := True;
ReportMemoryLeaksOnShutdown:=true;
退出程序的時候,如果有內存泄漏,會彈出一個對話框.
*1就是有1個,3就是有3個,2就是有2個
13 - 20 bytes: TJSONNumber x 1, TJSONObject x 1, TJSONString x 3, TJSONPair x 2, UnicodeString x 2
21 - 28 bytes: UnicodeString x 1, Unknown x 1
29 - 36 bytes: UnicodeString x 1
37 - 44 bytes: TList<System.JSON.TJSONPair> x 1
一、JO 要釋放
jo := TJSONObject.ParseJSONValue('{"name": "John Smith", "age": 33}') as TJSONObject;
這個用完jo.free,否則就有內存泄漏 或者 freeandnil(jo);
如果jo多次使用,下面2種方法都可以,釋放沒問題。
//if jo<>nil then freeandnil(jo);
if jo<>nil then jo.Free;
二、Serialize 有泄漏
self.injson := system.JSON.Serializers.TJsonSerializer.Create.Serialize<TPerson>(inp);
改為
var tt := system.JSON.Serializers.TJsonSerializer.Create;
self.injson:= Serializer.Serialize<TPerson>(inp);
tt.Free;
TJsonSerializer.Create.Deserialize也有泄漏換成 create free就好了
三、TJSONArray 無泄漏
var jr:tjsonarray;
jr := jo.GetValue<TJSONArray>('data.dataList') ;
for i := 0 to jr.Count - 1 do
begin
jrow := jr.Get(i) as TJSONObject;
self.Caption:= jrow.GetValue<string>('ampm');
end;
封裝后調用簡單,無內存泄漏
TKPJSON=class class function Deserialize<T>(const AJson: string): T; class function Serialize<T>(const AValue: T): string; end; class function TKPJSON.Deserialize<T>(const AJson: string): T; begin var tt := system.JSON.Serializers.TJsonSerializer.Create; result:= tt.Deserialize<T>(ajson); tt.Free; end; class function TKPJSON.Serialize<T>(const AValue: T): string; begin var tt := system.JSON.Serializers.TJsonSerializer.Create; result:= tt.Serialize<T>(AValue); tt.Free; end;
self.injson:= TKPJSON.Serialize<T100110>(inp);//簡單到一行代碼
var top := TKPJSON.Deserialize<T100110>(self.injson);//簡單到一行代碼