3

查看 Apple 示例代码iPhoneCoreDataRecipes,我对以下代码段有疑问RecipeDetailViewController.m

case TYPE_SECTION:
    nextViewController = [[TypeSelectionViewController alloc]
        initWithStyle:UITableViewStyleGrouped];
    ((TypeSelectionViewController *)nextViewController).recipe = recipe;
    break;

在这一行((TypeSelectionViewController *)nextViewController).recipe = recipe中,我知道内括号是将视图控制器类型转换为 a TypeSelectionViewController,但是外括号有什么作用?

4

2 回答 2

9

这与操作的优先级有关。

如果你看这里,你会发现点符号的优先级高于强制转换。

所以这段代码:

(TypeSelectionViewController *)nextViewController.recipe

将由编译器转换为以下内容(因为点 . 符号只是编译器的语法糖):

(TypeSelectionViewController *)[nextViewController recipe]

但是,我们想将nextViewController零件转换为 type TypeSelectionViewController *,而不是[nextViewController recipe]零件。所以这是不正确的。

因此,我们改为这样写:

((TypeSelectionViewController *)nextViewController).recipe 

编译器将其转换为:

[(TypeSelectionViewController *)nextViewController recipe]

这就是我们想要的。

关于编译器与运行时行为的注意事项

如果你编译这个错误转换的例子:

UILabel *label = [[UILabel alloc] init];
NSString *result = (UILabel *)label.text;

你会从编译器中得到这样的消息:

Warning: incompatible pointer types initializing 'NSString *' with an 
  expression of type 'UILabel *'

但是,由于 Objective C 的弱类型化,代码在运行时可以正常工作。您可以在LLVM 文档中阅读更多相关信息,例如:

在运行时不检查对象指针类型之间转换的有效性。

于 2013-10-24T15:03:46.250 回答
0

这是一个演员表,据说 nextViewController 是 TypeSelectionViewController 的一个实例,所以你可以使用它的属性配方

于 2013-10-24T14:55:18.410 回答