在已发布的 Runnable 中引用时,变量分配在哪里?
Where are variables allocated when referenced within posted Runnables?
我的理解(尽管可能不正确!)是在 Method1()
中,myInt
将分配在堆栈上,然后在从方法返回时释放。
我的问题是 myInt
将在 Method2()
中分配的位置,因为该方法可以在 [=16= 之前从(因此 myInt
从堆栈中释放)返回] 发布到UI线程的Looper
被执行?然而,在测试中,Runnable
似乎仍然能够引用 myInt
。编译器是否会自动将 posted Runnables
中引用的变量移动到堆中,即使它们通常会在堆栈上分配?
public void Method1()
{
int myInt = 0;
/* Do some operations on myInt */
myInt = 5;
}
public void Method2()
{
int myInt = 0;
RunOnUiThread(() =>
{
/* Do some operations on myInt within a Runnable posted to the UI thread's Looper */
myInt = 5;
});
}
方法 2 创建 Closure。作为 实现细节 (即:语言设计者可以自由更改它),编译器通过在捕获值现在所在的场景后面创建 class 来使闭包工作成员 属性,对值的访问现在被重写为对 class.
实例中 属性 的访问
换句话说,现在在堆上分配了一个 class 实例来保存这个值。
同样,这是一个实现细节。有可能(虽然不太可能)未来的修订可能会做一些事情,比如分配一个额外的堆栈帧而不是 class 实例。
我的理解(尽管可能不正确!)是在 Method1()
中,myInt
将分配在堆栈上,然后在从方法返回时释放。
我的问题是 myInt
将在 Method2()
中分配的位置,因为该方法可以在 [=16= 之前从(因此 myInt
从堆栈中释放)返回] 发布到UI线程的Looper
被执行?然而,在测试中,Runnable
似乎仍然能够引用 myInt
。编译器是否会自动将 posted Runnables
中引用的变量移动到堆中,即使它们通常会在堆栈上分配?
public void Method1()
{
int myInt = 0;
/* Do some operations on myInt */
myInt = 5;
}
public void Method2()
{
int myInt = 0;
RunOnUiThread(() =>
{
/* Do some operations on myInt within a Runnable posted to the UI thread's Looper */
myInt = 5;
});
}
方法 2 创建 Closure。作为 实现细节 (即:语言设计者可以自由更改它),编译器通过在捕获值现在所在的场景后面创建 class 来使闭包工作成员 属性,对值的访问现在被重写为对 class.
实例中 属性 的访问换句话说,现在在堆上分配了一个 class 实例来保存这个值。
同样,这是一个实现细节。有可能(虽然不太可能)未来的修订可能会做一些事情,比如分配一个额外的堆栈帧而不是 class 实例。