首先,我昨天以不同的方式问了这个问题。经过更多的实验后,我仍然不清楚“为什么”。我了解我需要做的事情,但想弄清楚正在发生的事情。这是场景...

我从一个简单的清单,一个单一视图的应用程序开始,然后简单地将以下NSLog添加到appDelegate……

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSLog(@"%@",[self.window.rootViewController description]);

    return YES;
}


以上收益

<ViewController: 0x17e7dbf0>


现在,当我创建一个名为“ TestViewController”(类型为UIViewController)的新类并将其分配给故事板中的控制器时,上述NSLog返回

<TestViewController: 0x146594c0>


因此,我的问题是,“如果前面的描述显示rootViewController的类型为“ TestViewController,为什么我需要进行类型转换(TestViewController *)?我为什么不能这样做...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    TestViewController *tvc = self.window.rootViewController;
    return YES;
}


代替...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    TestViewController *tvc = (TestViewController*)self.window.rootViewController;
    return YES;
}


我想清除这里的雾气。我错过了哪一个难题?

谢谢你的帮助!

最佳答案

在第二种情况下,您是告诉编译器您更了解。 self.window.rootViewController的返回类型是UIViewController指针。但是您正在尝试将其分配给TestViewController类型的指针。没有强制转换,编译器会警告您这不是适当的分配。通过强制转换,您可以告诉编译器“相信我-我知道视图控制器实际上是TestViewController”。当然,如果发现您错了,则在运行时可能会出现问题,也可能不会出现问题。

在第一种情况下,您会在运行应用程序时看到实际类的输出。 description方法返回对象的实际类的名称及其在内存中的地址。

您的两种情况之间确实没有任何关系。

关于ios - 收到以下内容后,为什么必须输入内容?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17767597/

10-08 22:50