首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非空对象上使用NullReferenceException的Monotouch崩溃

非空对象上使用NullReferenceException的Monotouch崩溃
EN

Stack Overflow用户
提问于 2013-04-24 23:17:52
回答 1查看 545关注 0票数 2

以下是崩溃日志(简短):

2013-04-24 19:56:24 +0000 Memotion未处理托管异常:对象引用未设置为对象实例(System.NullReferenceException) Pipedream.UI.UIElement.set_Size (Vector2值) 0x00000 in :0 在Pipedream.UI.StageLayer..ctor (Pipedream.ComponentID id) 0x00000 in :0 在Pipedream.UI.Stage.CreateLayer (Pipedream.ComponentID id) 0x00000 in :0

实际上,构造函数的代码如下所示:

代码语言:javascript
复制
internal StageLayer(ComponentID id)
    : base(id, ComponentLayer.System)
{
    base.Size = ApplicationBase.Instance.ScreenSize;
    ApplicationBase.Instance.PropertyChanged += HandlePropertyChanged;
}

这个财产看起来是这样的:

代码语言:javascript
复制
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-method时,会引发异常。无论如何,我认为非虚拟的泛型方法不应该产生任何问题?

代码语言:javascript
复制
protected Boolean CompareUpdate<T>(DependencyProperty property, T newValue, T oldValue)
{
    if (!Object.Equals(newValue, oldValue))
    {
        ForceUpdate(property, newValue, oldValue);
        return true;
    }
    return false;
}

编辑2

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

代码语言:javascript
复制
Log.Info(_Size.X.ToString()); // _Size is still a struct

除此外:

System.NullReferenceException:未设置为对象实例的对象引用 在/Developer/MonoTouch/Source/mono/mcs/class/corlib/System/Single.cs:260中的System.Single.ToString () 0x00000 在Pipedream\00_FRAMEWORK\trunk\Pipedream\UI\UIElement.cs:332中Pipedream.UI.UIElement.set_Size (Vector2值) 0x00031

如果我将原始代码更改为以下内容,也没有错误:

代码语言:javascript
复制
Vector2 old = _Size;
if (SetData(SizeDeclaration, value, ref _Size, Invalidate))
{
    CompareUpdate(WidthDeclaration, 0f, 0f);
    CompareUpdate(HeightDeclaration, 0f, 0f);
}

当我移除SetData-method时,也会发生此错误,因此这不可能是错误原因。我已经检查了这个引用,所以堆栈似乎没有问题,但是如果我尝试访问_Size的变量X并尝试将其打印到控制台,那么NullReferenceException就会再次发生。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-01 21:33:55

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

现在删除行已删除了该问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16203847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档