最近做了一个symbian的项目,刚刚做完,总结一下心得,共享一下:)
1、减少回调的使用
symbian中没有消息队列,所以模块与外部的主动通信要通过回调的形式来进行。但是过度的使用回调不但会使整体的程序结构显的混乱,而且在调试的过程中会出现一些我们打死都不会想到是什么原因的问题。
在开发中我们中遇到过这样的问题,当时一个模块需要用户进行相应的操作后发送网络数据包,开始我采用的方法是在回调中去完成,想让该模块尽量不涉及到网络数据的收发,减少与网络通信模块的偶合。但在运行过程中会有比较频繁的crash现像,找原因发现crash的地方在读取资源文件中的字符数组(调用ReadDesCArrayResourceL)时与new操作时出现,奇怪的是对于同一个字符数组有时候读取是没有问题,而有时候读取一定是有会crash,而new操作crash的现像比较少的出现。针对这一现像,我们仔细检查字符数组的编码方式,命名方式,大小写,甚至减小字符数组的大小,但还是会出现crash。正当苦于找不到原因时,偶然的一个想法改变了这一切。因为调用模块的模块是另外同事写的,每次改动回调都需要外边的配合,为了减小相互之间的改动,我采取了把网络模块的指针在构造时传入的方法,所有的发包都在内部去完成。没想到这一改,以前的crash现像再也没有出现。后来分析原因可能是模块间的回调有些频繁导致调用过程中的混乱出现了意想不到的crash。
2、减少因字节对齐出现的数据错误及设备crash
在手机设备上开发与PC不同,当我们定义的数组,变量是跨字节边界时,如果直接对该变量进行强制类型转换时,就必然会在设备上出现crash(模拟器版本可能不会出现),如果用memcpy进行struct中数据操作时会出现得到的数据与源数据不相符,这里提供以下方法加以避免。
一、通过宏定进行紧凑方式定义避免memcpy数据操作错误
//1.在用到结构数据的文件头前加上如下定义,强制CPU进行一个字节对齐
#if defined(__WINS__)
#define PACKED
#else
#define PACKED __attribute__(( pack ed, aligned(1)))
#endif
//2.在定义结构数据前加上如下定义
#pragma pack (1)
//3.定认结构数据,如
typedef struct
{
BYTE sNum;
unsinged shor uSeq; //序列号
BYTE cType[21];
BYTE cFlag[30];
} PACKED stCmdList;
//4.恢复字节对齐的默认设置
#pragma pack (4)
这里要注意的是,使用紧凑方式定义后,我们仍然不能直接对struct中的变量进行强制类型转换!
二、在定义数据结构时,尽量使用class进行定义
使用class的好处是可以对class中的数据内存操作进行必要的封装,我们的建议时,对于class中要用到的整块内存数据使用new来进行分配,因为new分配的数据一定是从字节的起始位置开始的,这样进行强制类型转换时设备就不会crash了。
3、解决调用系统摄像头,摄像后的析构问题
见文章:如何调用S60的系统摄像头功能进行拍照与摄像?