1. 根据 Delphi 指令参考手册中 说明: 而参数为 nil 时则传回 False 。 技巧:
2. 这个问题要从内存方面来解释 当我们无法预测使用者会如何操爆他的计算机, Description Use Assigned to determine whether the pointer or procedure referenced by P is nil. P must be a variable reference of a pointer or procedural type. Assigned(P) corresponds to the test P<> nil for a pointer variable, and @P <> nil for a procedural variable. Assigned returns False if P is nil, True otherwise. 检查指针指向的参考变量或过程是否为 nil 每次我通常的处理方法都是: if assigned(frm) then frm.close; 但是当下次调用时就会出错。为什么呢,直到咋天我才知道原因 frm.close;frm.free; 只是指定这块内存可以重写,并未释放为 NIL 因此当下次调用时即使 frm.free 已经 执行过 assigned(frm) 仍为 TRUE ,再次释放 frm.Close 或者 frm.free 肯定会报错;应为 frm.Close 或 frm.free 是释放 对象指针 frm 指向的内存空间,在上次已经释放调了,但是 frm 本身并没有 初始化为 nil , 相反它还是指向被释放的内存地址;东西已经没有了,没有地东西去释放,不报错错才怪。 正确的处理方法: if assigned(frm) then 或 : if assigned(frm) then
// 可以测试一些就能真正理解 FreeAndNil 和 Assigned 函数地使用方法了; procedure FreeAndNil(var Obj); Description Use FreeAndNil to ensure that a variable is nil after you free the object it references. Pass any variable that represents an object as the Obj parameter. var P: Pointer; begin |