
游戏的设计
|
29
例如,你可以定义这样一个闭包,在某个游戏对象开始攻击你的
2
秒之内运行这个
闭包。但是,在你调度完闭包但闭包还未得到执行的这段时间内,这个对象从游戏
中移除了。因为这个闭包有一个该游戏对象的强引用,因此这个对象无法真正从内
存中移除,而是要等待闭包执行完,这就会带来一些预想不到的后果。
要解决这个问题,我们需要使用弱引用。当一个对象已经被销毁的时候(因为所
有引用它的对象都已经被销毁),弱引用不会在内存中持有(
retain
)这个对象,
而且这时弱引用会自动被设置为
nil
。关于弱引用,读者可以参考《
The Swift
Programming Language
》
ARC
一章(
http://bit.ly/auto_ref_counting
)。
1.12
在方法中回调闭包
问题
有时候,我们会定义某个方法,使用一个闭包作为参数。这样,当该方法执行完其
主体代码之后能够回调这个闭包。
例如,让一个角色运动到终点的时候,回调一个闭包,以便通知我们该角色已经到
达指定的位置。
解决方案
创建一个方法,然后使用闭包作为它的参数:
func move(to position : CGPoint, completion: (()->Void)?) {
//
执行运动,使对象移动到终点,这个过程可能
//
需要几个动画帧的时间。
//
当闭包参数不为空时,调用闭包进行后续处理
completion?()
}
let destination = CGPoint(x: 5, y: 3)
//
调用方法,并提供一个闭包参数 ...