1.两阶段构造
为了防止内存泄露,bada在构造对象时使用了两阶段构造,个人觉得bada的内存管理很大程度上借鉴了symbian。先让我们来看看bada文档上这段代码:
class SimpleClass;
class ComplexClass
{
public:
ComplexClass(void)
{
p1 = new SimpleClass();
p2 = new SimpleClass(); // Out-of-memory error
}
~ComplexClass(void)
{
delete p1; delete p2;
}
private:
SimpleClass* p1;
SimpleClass* p2;
};
void MyClass::SomeFunction()
{
// 调用构造函数,如果这里内存分配失败,其析构函数将不会被调用,也就是说会造成内存泄露
ComplexClass a;
}
class TwoPhaseClass
{
public:
TwoPhaseClass(void): p1(null), p2(null) { }
~TwoPhaseClass(void)
{
delete p1;
delete p2;
}
result Construct(void)
{
p1 = new SimpleClass();
if(null == p1)
{
return E_OUT_OF_MEMORY;
}
//这里如果p2构造失败将调用p2的析构函数
p2 = new SimpleClass();
if(null == p2)
{
delete p2;
return E_OUT_OF_MEMORY;
}
return E_SUCCESS;
}
private:
SimpleClass* p1;
SimpleClass* p2;
};
void MyClass::SomeFunction()
{
// 第一阶段:调用构造函数,只是分配空间,这里不会抛出异常
TwoPhaseClass a;
//第二阶段:调用Construct()方法,这里会构造两个SimpleClass实例
result r = a.Construct();
//方法结束,这里会调用a的析构函数,这里编译器会为你加上a.~TwoPhaseClass(),只是你看不见罢了
}
以上代码直接从baba文档里拿来的,只是让大家了解一下baba的两阶段构造,不过说实话bada的编程规范实在不敢恭维
2.对象所有权策略(Object Ownership Policy)
在bada中,获得对象所有权有两个规则:
(1)new操作符会获得刚分配空间的所有权
(2)对象所有权可以被转移但不能共享,其实开发者也可以使用shared pointer只是bada SDK中他是这么要求自己的。
这是主要想说是bada系统中特有的N后缀,我们经常会看到有些方法的后缀是N后缀的,这里就是对象所有转移了,方法调用者要自己删除。
class A
{
public:
IList* SearchN(const String& criteria) const;
// Other methods declared here
};
IList* A::SearchN(const String& criteria)
{
// Search with criteria and return the results by storing them in the list
ArrayList* pList = new ArrayList(); // Add the search results to the list
return pList;
}
void MyClass::SomeMethod(void)
{
A a;
IList* pList = a.SearchN(L"Most popular"); // 要删除list
delete pList;
}