今天修复了一个bug,大致描述为内存中的数据莫名其妙的被修改掉了。
实际项目比较庞大,不再赘述。
代码描述如下(简易代码):
实际项目比较庞大,不再赘述。
代码描述如下(简易代码):
public interface IInterfaceA
{
float GetNum();
}
public class ClassA : IInterfaceA
{
public float GetNum()
{
return 1f;
}
}
public class Test
{
private IInterfaceA instanceA;
public Test()
{
instanceA = new ClassA();
}
public void Click()
{
float a = instanceA.GetNum();
//ClassA classA = instanceA as ClassA;
//float a = classA.GetNum();
}
}
bug重现方法描述如下(非必现- -):
bug的现像为调用Click方法中的float a取出来的并不是1f而是如:3.456789E-30这样一个趋近于0的浮点数,而且每次取的时候,会不一样。
1,项目为unity3d发布出来的ios项目脚本为C#
2,产生bug的测试设备为:ipadmini、ipadmini2,iphone4s
3,同样的代码在android设备上运行正常,在windows和mac下的unityeditor中运行正常
可能会怀疑,代码复杂的时候instanceA不再是ClassA的一个实例,而是其它一个实现了IInterface的一个实例,实际review代码的时候已经把能精简的代码全给注释掉,从review的层面确保是同一个实例。
并且对比过GetHashCode()取值,为相同。完全排除了这种可能。
解决方法:
尝试过N种写法,都失败了 。 。 。
尝试过N种写法,都失败了 。 。 。
最后当把instanceA强转为ClassA类型的时候再次取a(被注释掉的两行代码),结果正常,为1f
猜想:
猜想可能会出现相关bug的情况:继承关系,接口实现。尽管我们写代码的时候不能放弃接口和继承,但出现类似问题的时候一定要看下相关的代码是否用了接口和继承,只要是多态,不明确自己到底是哪个模版(Class)的实例 时候, 对unity3dios项目会比较危险。
猜想:
猜想可能会出现相关bug的情况:继承关系,接口实现。尽管我们写代码的时候不能放弃接口和继承,但出现类似问题的时候一定要看下相关的代码是否用了接口和继承,只要是多态,不明确自己到底是哪个模版(Class)的实例 时候, 对unity3dios项目会比较危险。
本周发部的unity4.5.0已经解决了这个BUG,文档中有提到