小幻跟师姐都遇到这个问题了,所以写下来,省得下次又忘记。
经常讲做移动平台开发要时刻注意内存管理。
结果这个错误就是因为太注重内存管理导致的。
苹果官方解释如下:
This kind of problem is usually the result of over-releasing an object. It can be very confusing, since the failure tends to occur well after the mistake is made.The crash can also occur while the program is deep in framework code, often with none of your own code visible in the stack.
over-releasing,我们时常会初始化一个临时变量来放一些数据什么的,之后又会把它们赋给其他变量,然后就觉得这个变量没用了就可以release了。但是有时候release完了反而不对。为什么呢,因为我们大部分定义的是指针,指向一段内存的,release之后,那段内存给释放了,即使之前已经把它的值赋给其他变量了,其他变量用的时候根据内存地址找不到东西,就报这个EXC_BAD_ACCESS错误了。所以这个时候就单步调试下,看看是哪里的变量调用出了错,然后再返回去找跟它有关的临时变量,看看那个对象被over-release了,再然后小幻就不多说啦。
用深拷贝,不过那就浪费内存了是吧
回复黑暗斗篷:可以,拷贝完立即把临时那个release掉,这样应该就不会浪费了吧?
目前我都赋完指针以后就那么扔着,觉得它占的只是一个指针的空间,函数调用结束后它的生命周期到了也就自己销毁了。只是它指向的那块空间不会自动释放,所以在函数调用要结束而那片内存里的数据我还要用的时候,我都要保证那片空间的引用被赋给生命周期更长的变量,由它们来release。思路对的吧?
嗯,我用java时间长了,对释放空间这个概念很陌生了已经。 但你说的方法很容易出错...指针最好还是少用,用普通变量来存放临时数据也许更好(自动释放内存)。
我想到一个,把类似的指针变量抽取成函数的参数,比如你代码段中一个临时指针,指向的数据在别的函数里会被用到,那你就为函数增添一个指针参数,把临时指针赋值给这个指针参数,当你调用这个函数的时候,需要提供一个指针准备接收数据。 本质和你的做法是一样的,只是这个可能在形式上能提供一点点约束和提醒。
回复黑暗斗篷:objective-c里基本都是对象,做操作很少有不靠引用的。刚开始写的时候经常忘记加*,低级错误众多。参数我用的,省心,不过有时候有些活动在内部的临时变量没法传。前几天写的一个类,在一个函数里获取了文件路径,就临时用一下,用完不需要就release了,结果就报错,后来没办法,就只能那么放着,索性是个string,开销不是特别大。现在想想,当时应该把这些不能release的东东统统放进auto-release的池里才对。越来越觉得好的代码习惯跟编程思路很重要。在这方面,还有好远的路要走。
回复角落里的幻觉:所以说编码质量和对语言的把握息息相关啊