记一个低级的错误
2016-06-01 本文已影响57人
mercurygear
现象
一个简单的App,在测试机iPhone6S上正常运行,准备打包了。临时发现需要iPhone5尺寸的应用截图,就开了iPhone5的模拟器,准备运行应用来截图。
结果发生了崩溃,一看崩溃堆栈,是访问Model的某个属性的时候崩溃了,报了访问错误地址的异常。当时觉得很奇怪,以为是获取回来的网络数据出错了,核对了一下,发现没问题。
再仔细看了下崩溃时的Model,除了有两个属性不正常之外,其他的属性值和类型都是正确的。下意识以为是那里内存写溢出了,把这个Model给破坏了,就review了下代码,发现没啥问题。
再回过头来细思一下,如果内存被覆写了,那Model不应该就那两个属性有问题,而其他正常。翻看了下Model的定义,结果就发现问题所在了。
出问题的那两个属性是NSString *类型的,但是错误地使用了assign修饰,导致问题的产生,修改成正确的copy修饰之后,一切正常了。
总结
这个问题的产生是因为最初先根据网络接口文档定义好了Model,出问题的两个属性在文档里说明是int类型的,只是调试的时候才发现文档不正确,实际传过来的是字符串。所以就把两个属性的类型改成了NSString *,但是忘记把修饰的assign改成copy了。一个粗心大意导致了这么个问题的出现。