クラッシュ ログ ( short ) は次のとおりです。
2013-04-24 19:56:24 + 0000 Memotion Unhandled managed exception: オブジェクト参照がオブジェクト (System.NullReferenceException) のインスタンスに設定されていません
。
Pipedream.UI.StageLayer..ctor (Pipedream.ComponentID id) [0x00000] in :0
Pipedream.UI.Stage.CreateLayer (Pipedream.ComponentID 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
-method を呼び出す必要があるときに例外がスローされることが判明しました。とにかく、非仮想ジェネリック メソッドは問題を起こすべきではないと思いましたか?
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
この例外を除いて:
System.NullReferenceException: Object reference not set to an object
at System.Single.ToString () [0x00000] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System/Single.cs:260
at Pipedream .UI.UIElement.set_Size (Vector2 値) [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
このエラーは-method を削除したときにも発生するため、これがエラーの原因になることはありません。this 参照を確認したので、スタックは問題ないようですが、_Size
s 変数にアクセスX
してコンソールに出力しようとすると、NullReferenceException が再び発生します。