Monotouch在非空对象上因NullReferenceException而崩溃

本文关键字:NullReferenceException 崩溃 对象 Monotouch | 更新日期: 2023-09-27 18:10:51

崩溃日志(短):

2013-04-24 19:56:24 +0000 Memotion未处理的托管异常:Object reference not set to a instance of a Object (System.NullReferenceException)
在Pipedream.UI.UIElement。set_Size (Vector2 value) [0x00000] in:0
在Pipedream. ui . stagelayer…ComponentID id) [0x00000] in:0
在Pipedream. ui . stage . createlayerComponentID id) [0x00000] in:0

实际上构造函数的代码是这样的:
internal StageLayer(ComponentID id)
    : base(id, ComponentLayer.System)
{
    base.Size = ApplicationBase.Instance.ScreenSize;
    ApplicationBase.Instance.PropertyChanged += HandlePropertyChanged;
}

属性是这样的:

public virtual Vector2 Size
{
    get
    {
        return _Size;
    }
    set
    {
        Vector2 old = _Size;
        if (SetData(SizeDeclaration, value, ref _Size, Invalidate))
        {
            CompareUpdate(WidthDeclaration, _Size.X, old.X);
            CompareUpdate(HeightDeclaration, _Size.Y, old.Y);
        }
    }
}

Vector2是一个结构体,不能是null。此外,这段代码可以完美地在桌面上工作。我想不出为什么这段代码应该崩溃,但它也没有在iOS模拟器上,只有在iOS设备上(我目前没有设备,所以我不能直接调试它)。

我在调用此代码之前启动了一些任务,但它们使用自己的数据并且不能与当前数据冲突,即使这样也不应该有任何NullReferenceException

编辑

结果是当应该调用CompareUpdate -方法时抛出异常。不管怎样,我认为非虚拟泛型方法不应该有任何问题?

protected Boolean CompareUpdate<T>(DependencyProperty property, T newValue, T oldValue)
{
    if (!Object.Equals(newValue, oldValue))
    {
        ForceUpdate(property, newValue, oldValue);
        return true;
    }
    return false;
}

编辑2

在一些更多的测试案例后,我发现这可能是一个真正的编译器问题。以下测试失败:

Log.Info(_Size.X.ToString()); // _Size is still a struct

系统。NullReferenceException:对象引用未设置为对象的实例
at System. single . tostring () [0x00000] in/Developer/MonoTouch/Source/mono/mcs/class/corlib/System/Single.cs:260
在Pipedream.UI.UIElement。set_Size (Vector2 value) [0x00031] in C:'WORK'00_PROJECTS'16 Pipedream'00_FRAMEWORK'trunk'Pipedream'UI'UIElement.cs:332

如果我将原始代码更改为以下代码,也不会出现错误:

Vector2 old = _Size;
if (SetData(SizeDeclaration, value, ref _Size, Invalidate))
{
    CompareUpdate(WidthDeclaration, 0f, 0f);
    CompareUpdate(HeightDeclaration, 0f, 0f);
}

这个错误也发生当我删除SetData -方法,所以这不能是错误的原因。我已经检查了这个引用,所以堆栈似乎是好的,但如果我尝试访问_Size s变量X,并尝试将其打印到控制台的NullReferenceException再次发生。

Monotouch在非空对象上因NullReferenceException而崩溃

事实证明这有一个架构差异错误。Vector2[StructLayout(LayoutKind.Sequential, Pack = 1)]行导致Vector2不对齐,这在某些体系结构中是非法的。

现在删除这一行就解决了这个问题。