- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@“DoSomething”]) {
if ([segue.destinationViewController isKindOfClass:[DoSomethingVC class]]) {
DoSomethingVC *doVC = (DoSomethingVC *)segue.destinationViewController;
doVC.neededInfo = ...; }
}
}
在上面的代码中,我不明白你为什么需要局部变量doVC。
如果您的destinationViewController已经存在于堆中,为什么不能将数据作为
传递给它seque.destinationViewController.neededInfo =...
如果堆中不存在,你不应该分配和初始化它吗?这就是这行代码基本上做的吗?
DoSomethingVC *doVC = (DoSomethingVC *)segue.destinationViewController;
您是在分配和实例化DoSomethingVC类的实例吗? 如果是这样,我不明白这个局部变量将如何保持活着,因为它是本地的。一旦seque完成,sourceVC也将死亡。
我只是不明白编译器如何操作此进程后面的内存并将此局部变量中的数据同步到destinationViewController。
答案 0 :(得分:1)
segue.destinationViewController
的类型为UIViewController
(即使它实际上是DoSomethingVC
,其基本类型为UIViewController
),因此它不会知道您的变量neededInfo
这就是您需要将其投射到DoDomethingVC
的原因。
它将segue.destinationViewController
作为类型UIViewController
保持通用,因为它无法在编译时真正了解此destinationViewController
将会是什么。
预感到你对继承的把握有点不稳定(不是试图表达意思),但如果UIViewController
表示类型为Bird
且DoSomethingVC
为Duck
,则可以进行类比。键入prepareForSegue:
,此Bird
方法知道Duck
将是destinationViewController,但此时它不知道它是{{1}}还是其他那种鸟,所以你必须明确告诉它它将会是什么(如果你弄错了它会做坏事,或者崩溃),框架也不知道那里有什么种类的鸟(因为你正在制作他们),所以它不能为你考虑