目标C为什么我需要在这种情况下输入Cast?

时间:2013-07-20 00:02:50

标签: ios objective-c casting appdelegate

我有一个故事板,其中rootViewController类设置为CoursesTableViewController。

为什么在appDelegate中我需要使用类型转换,如本示例所示......

- (BOOL)application:(UIApplication *)application 
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    CoursesTableViewController *cvtc 
       = (CoursesTableViewController *)self.window.rootViewController;

为什么我不能这样做......

- (BOOL)application:(UIApplication *)application 
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    CoursesTableViewController *cvtc = self.window.rootViewController;

3 个答案:

答案 0 :(得分:2)

您正在做的事情被称为向下转型。你需要这样做,因为多态允许指向某个类的对象的指针,指向它的类的子类的对象的指针,但不是反之亦然(因为它没有说指针实际上指向一个属于该子类的对象,而在相反的情况下,这是保证的)。

这是您要调用的UIWindow属性:

@property(nonatomic, retain) UIViewController *rootViewController;  

就像你看到UIViewController类型一样,CoursesTableViewControllerUIViewController的子类。

PS :当我说它需要时,我的意思是避免编译器警告。

答案 1 :(得分:0)

rootViewControllerUIWindow类型UIViewController的属性。

如果要与特定于您的类型的属性和选择器进行交互,则需要将其强制转换为控制器类型。

答案 2 :(得分:0)

你实际上可以这样做。它只是警告你,因为期待一件事他正在看另一件事。当你进行投射时,只需让编译器知道你正在做什么就好了。

其类型:

enter image description here