我一直试图在iOS上发现内存泄漏,我99%的错误是在TScrollBox或TChart中。导致崩溃的动作很简单,就是在TChart上来回滚动。该应用程序在Win32中表现良好,并且内存使用情况稳定。
iOS上的崩溃原因是 EXC_RESOURCE-> myappname [5548]超出了内存限制:每个Xcode Console的ActiveHard 1400MB(严重)。
要排除我的意大利面条式代码作为罪魁祸首,我创建了一个简单的项目来重现该错误,并且它也崩溃了。以下是Xcode Console输出中的片段。我收到了很多断言,然后收到了Received memory警告,然后iOS内核杀死了我的应用程序(Project1)。
default 20:28:26.180333 -0500 assertiond [Project1:7693] Activate assertion: <BKProcessAssertion: 0x12b0102c0; "com.apple.UIKit.KeyboardManagement.message" (finishTask:180s); id:…8EA7F5E94DD5>
default 20:28:26.180542 -0500 assertiond [Project1:7693] Setting jetsam priority to 10 [0x10108]
default 20:28:26.182151 -0500 assertiond [Project1:7693] Deactivate assertion: <BKProcessAssertion: 0x12b0102c0; "com.apple.UIKit.KeyboardManagement.message" (finishTask:180s); id:…8EA7F5E94DD5>
default 20:28:26.182312 -0500 assertiond [Project1:7693] Setting jetsam priority to 10 [0x10100]
default 20:28:26.183307 -0500 assertiond [Project1:7693] Remove assertion: <BKProcessAssertion: 0x12b0102c0; "com.apple.UIKit.KeyboardManagement.message" (finishTask:180s); id:…8EA7F5E94DD5>
default 20:28:32.609723 -0500 Project1 Received memory warning.
然后不久,我看到以下控制台消息:
默认20:28:45.881914 -0500内核 EXC_RESOURCE-> Project1 [7693]超出了内存限制:ActiveHard 1400 MB(致命)。
我的崩溃测试应用程序是一个使用C ++ Builder 10.3.2构建的简单Firemonkey应用程序。
A)在表格(Panel1)上放置一个TPanel。
B)将TScrollBox放在Panel1(ScrollBox1)上。将其对齐方式设置为“内容”。
C)在ScrollBox1(Layout1)上放置一个TLayout。将其对齐设置为无。将其宽度设置为2100。
D)在Layout1上放置一个TChart。将其高度设置为200,宽度为7300。将其对齐设置为无。
E)在Form1中添加一个TToolBar并在其上放置一个TButton。
F)然后将此代码放入TButton的click事件中:
Form1->Layout1->Position->X = 0;
Form1->ChartTest->Position->Y = 0;
Form1->ChartTest->Position->X = 0;
TLineSeries *series1 = new TLineSeries(Form1);
TLineSeries *series2 = new TLineSeries(Form1);
TLineSeries *series3 = new TLineSeries(Form1);
TLineSeries *series4 = new TLineSeries(Form1);
series1->Color = claBlue;
series2->Color = claRed;
series3->Color = claBlueviolet;
series4->Color = claAqua;
double x, y;
for (int i = 0; i < 1000; i++) {
x = i;
y = Random(5000);
series1->AddXY(x,y);
y = Random(5000);
series2->AddXY(x,y);
y = Random(5000);
series3->AddXY(x,y);
y = Random(5000);
series4->AddXY(x,y);
}
Form1->ChartTest->AddSeries(series1);
Form1->ChartTest->AddSeries(series2);
Form1->ChartTest->AddSeries(series3);
Form1->ChartTest->AddSeries(series4);
G)现在,在将iOS设备连接到Mac并打开Xcode Console的情况下,如果您将控制台输出命名为“ Project1
”,则对其进行过滤。然后运行该应用程序,然后向后/向前和/或向上/向下滚动(如果要来回移动,也可以更改方向)。您将看到大量的断言。最终(这种骚扰大约需要2-3分钟才能使其崩溃),它将耗尽足以使其崩溃的内存。
我认为内存泄漏很可能是在TeeChart中出现的,也许是在TScrollBox中?
谢谢, 鲁斯
答案 0 :(得分:0)
内存泄漏在TChart
中。我创建了另一个没有滚动框的简单项目,并添加了一个计时器,该计时器每0.1秒上下移动TChart。 2-3分钟后,在单击Button1开始操作后,它在iOS上由于没有用户输入而导致内存错误而崩溃。发生这种崩溃的原因是没有滚动或任何交互-只是图表摇摆不定。
在Win32上测试应用程序工作正常-内存稳定且没有增长。
因此,我希望在创建图表方面有一些明显的不足之处-由于Steema图表非常灵活,我真的不想放弃该船。我也发布到了Steema论坛,但是由于数量太少,我也在这里发布。
有什么想法吗?注意我还使用了2019年5月30日发布的TeeChart Standard VCL / FMX的许可版本-Build 2019.27.190530。我还运行了一个测试用例,其中图表是固定的(没有用户输入,也没有计时器事件移动图表)并且没有崩溃。它与以某种方式重新调整图表有关。我尝试了Form1->ChartTest->AutoRepaint = false;
,但没有任何效果。压缩的测试项目在这里:Project1a
谢谢, 鲁斯
更新:TeeChart Standard版本2019.27.190530中存在内存泄漏错误,但Rad Studio 10.3附带的免费/精简版中没有不存在。截至目前为2(版本v2016.17.160129)。