这是一本关于iphone游戏开发的书。
[((GameState*)viewController.view) Update];
“viewController”是UIViewcontroller的一个实例,“GameState”是UIView的子类,“Update”是“GameState”的一个方法。你能告诉我发生了什么吗?这种语法是否允许 viewController 使用 GameState 的方法?如果这是一个愚蠢的问题,我深表歉意。
这是一本关于iphone游戏开发的书。
[((GameState*)viewController.view) Update];
“viewController”是UIViewcontroller的一个实例,“GameState”是UIView的子类,“Update”是“GameState”的一个方法。你能告诉我发生了什么吗?这种语法是否允许 viewController 使用 GameState 的方法?如果这是一个愚蠢的问题,我深表歉意。
所做的只是告诉编译器“嘿,viewController.view 实际上是 GameState* 类型”。它实际上并没有对它做任何事情,只是让编译器知道,所以它不会警告它。
请注意,像这样对编译器撒谎是完全合法的,它会相信你,不会检查你的工作,所以如果可以的话,最好避免强制转换。如果你把它转换成它不是的东西,如果你尝试使用它没有的方法,它就会崩溃。
这里发生的是 C 类型转换:你告诉编译器你知道你viewController
的 'sview
是 type GameState
,并且你知道调用GameState
这里的方法是可以的,即使这些方法不是UIView
's 的一部分界面。
意味着 viewController 的视图被强制转换为 GameState(UIView 的子类),这样编译器就不会抱怨调用了 Update 方法。
这有可能产生运行时错误的不便,所以为了安全起见,我将把前面的语句附在:
if ([viewController.view isKindOfClass:[GameState class]])