【发布时间】:2018-10-04 16:56:25
【问题描述】:
我有这段代码(在 iOS 和 Delphi Tokyo 下运行):
procedure TMainForm.Button1Click(Sender: TObject);
var aData: NSData;
begin
try
try
aData := nil;
finally
// this line triggers an exception
aData.release;
end;
except
on E: Exception do begin
exit;
end;
end;
end;
通常应该在except end 块中捕获异常,但在这种情况下,它不会被处理程序捕获,而是传播到Application.OnException 处理程序。
地址0000000100EE9A8C的访问冲突,访问地址 0000000000000000
我错过了什么吗?
【问题讨论】:
-
在 AV 发生之前执行的最后一行是什么?
-
@DavidHeffernan 这是一个恰当的例子。如果您尝试在 iOS 上运行该代码,则异常处理程序不会捕获异常。
-
@RudyVelthuis 但这真的可以解释
Application.OnException事件在地址 0 处捕获 AV 吗?这表明release()正在触发一个异步 消息,该消息在Button1Click退出后得到处理(并因此崩溃) -
FWIW,@TheBitman:在 Delphi for Windows(和 VCL)中发布与在 NSObject 派生类(如 iOS 或 macOS 中的 NSData)上发布几乎不同。完全不同的东西。
-
@TheBitman:如果您希望所有人都能看到您删除的答案,请取消删除。但是您很可能会删除它并停止修改它。 NSData 是一个Objective-C 对象(与Delphi 对象几乎不一样),封装在一个实现NSData 接口的Delphi 类中(因此Delphi 可以使用它)。显然你对iOS一无所知,而TCustomForm.Release与NSObject.release完全无关。后者更像是接口的发布,用于手动引用计数。甚至调用方法的 NSObject 消息传递也与 Windows 中的消息不完全相同。
标签: delphi firemonkey delphi-10.2-tokyo