精简公理:
1. 当一个非空的接口指针从一个内存位置被拷贝到另一个内存位置时,应该要调用AddRef,以便通知对象又有附加的引用发生了。
2.对于已经包含非空接口指针的内存位置来说,在重写该内存位置之前,必须先调用Release, 以便通知对象“这个引用已经被销毁了”。
3.如果你对两个或者更多的内存位置之间的关系有特殊的理解,那么多余的AddRef和Release调用可以被优化掉。
编程指导:
A.要求调用AddRef的情形:
A1.当把一个非空接口指针写到局部变量中时。
A2.当被调用方把一个非空接口指针写到方法或者函数的[out]或者[in,out]参数中时。
A3.当被调用方返回一个非空接口指针作为函数的实际接口时。
A4.当把一个非空接口指针写到对象的一个数据成员中时。
R.要求调用Release方法的情形:
R1.在改写一个非空局部变量或者数据成员之前。
R2.在离开非空局部变量的作用域之前。
R3.当被调用方要改写方法或者函数的[in,out]参数,并且参数的初始值为非空时([out]参数不适用)。
R4.在改写一个对象的非空数据成员之前。
R5.在离开一个对象的析构函数之前,并且这时还有一个非空接口指针作为数据成员。
特殊情况:
S1.当调用方把一个非空接口指针通过[in]参数传给一个函数或者方法时,既不需要调用AddRef,也不需要调用Release,因为在调用堆栈中,临时变量的生命周期只是“用于初始化形式参数”的表达式地生命周期的一个子集。
posted on 2010-03-13 08:50
RUI 阅读(547)
评论(0) 编辑 收藏 引用 所属分类:
Software Development