WEB开发网
开发学院手机开发Symbian 开发 Symbian 下菜单的应用开发技巧 阅读

Symbian 下菜单的应用开发技巧

 2010-03-13 20:25:00 来源:WEB开发网   
核心提示:Trap harness,而具体的顺序是,Symbian 下菜单的应用开发技巧(6),发生异常时,并不是返回一个错误代码,一般系统为c++段准备一个清除栈,任何在_s中的语言发生异常时,而是直接异常退出,这个时候系统将调用User::Leave()
Trap harness,而具体的顺序是,发生异常时,并不是返回一个错误代码,而是直接异常退出,这个时候系统将调用User::Leave(),调用了它我们也就得以到该函数的异常捕捉模块中了。一般来说,我们自己没有什么必要来写这个Trap harness,Symbian的Framework 会在恰当的位置提供的,我们要做的就是在可能引起异常退出的函数名后面加上后缀L来确保异常的处理。

一般引起异常的也就是分配空间不足时可能发生,比如new操作,我们该咋办那,symbian是这么解决的,用了一个参数来调用new,即new(ELeave),有了它,在分配内存时出错了,咱们就可以异常退出了。

譬如说

CSomeObject* myObject = new CSomeObject;

if (!myObject) User::Leave(KErrNoMemory);

就可以替换为

CSomeObject* myObject = new(ELeave) CSomeObject;

对于但个对象,我们可以这么做,但是对于复合对象那,如果一个对象其中有一个成员指针指向另一个对象,那我们在构造这个对象的时候如何来保证在子对象出错的情况下正确的异常退出,而没有内存泄漏那?

这里牵涉到双向构造的知识点,总的来说是在NewL和NewLC函数中给出的解决的,而这两个又有区别,如果是用一个成员变量来指向改对象,那么应该使用 NewL函数,如果是自定义的变量就应该是用NewLC函数,因为NewLC可将对象压入清除栈,以便出现内存不足的时候正确退出,也就是C后缀总表示将指向已创建对象的指针压入清除栈,而具体实现上,NewLC和NewL的区别也就是LC没有最后的CleanupStack::Pop()函数,而L有,它也就最后出了清除栈的概念。

TRAP主要看看SDK的,很有帮助,

TRAP(_r, _s) {TTrap __t; if (__t.Trap(_r) == 0) {_s;TTrap::UpTrap();}}

我们是在一个异常捕捉里执行_s的,这个是一个c++段.。_r必须是一个TInt类型的值,我看过了这个是singed int 的定义。也就是int。 32位的。而且是要先声明。在宏外,相反,TRAPD就不用了,它在内部声明了,其他一样。如果有任何的c++段发生异常退出了,那退出的返回值就赋给了 _r(事实上,是从User::Leave()的返回值)正如前面讲的,发生异常时,系统调用的是User::Leave,我们看出来了,异常发生时的顺序也就是从语言到User::Leave到Trap) ,否则它就是KErrNone这个值。

这个时候,一般系统为c++段准备一个清除栈,任何在_s中的语言发生异常时,在清除栈中的对象都会被清除掉。

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:Symbian 菜单 应用开发

编辑录入:coldstar [复制链接] [打 印]
赞助商链接