对自己和代表团感到困惑

时间:2012-06-28 08:18:38

标签: iphone objective-c

此代码来自Utility app,由Apple在创建项目时添加。

这有什么区别:

- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller
{
    [self dismissModalViewControllerAnimated:YES];
}

而且:

- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller
{
    [controller dismissModalViewControllerAnimated:YES];
}

它们都有效,但第一个是Apple提供的Utility app的主要代码。 那么有什么不同,为什么自我运作? self是MainViewController,而不是FlipsideViewController。我不知道,这与代表团有关吗? 谢谢。

2 个答案:

答案 0 :(得分:2)

这完全取决于正在执行的对象flipsideViewControllerDidFinish;如果它与controller相同,那么它就是一样的。

实际上,有时候委托的类(在你的情况下是FlipsideViewController)也实现了委托协议(即,充当委托)。在这种情况下,selfcontroller是相同的。这将对应于委托初始化(例如,在init方法中),如:

 self.delegate = self;

但是你可以让你的委托成为一个不同的类(例如,应用程序委托,或者其他),在这种情况下,它们会有所不同。在这种情况下,你会说(例如在init中):

self.delegate = [UIApplication sharedApplication].delegate;

在这种情况下,应用程序委托将接收对FlipsideViewController的调用,controller参数将告知它引用的对象;在这种情况下,self!= controller

另一种情况是当您的委托充当多个对象的委托时;在这种情况下,controller参数告诉哪个对象是委托对象。

实际上,在委托方法实现中,您可以安全地使用controller参数而无需考虑。

答案 1 :(得分:2)

我知道答案已被选为正确的,Sergio在解释授权方面做得很好,但在这个具体案例中,答案要简单得多。在这种情况下,selfcontroller不是一回事(正如您在问题中所说的那样)。 self是呈现控制器,controller是呈现的控制器。因此,两个调用都有效的原因是:

  

呈现视图控制器负责解除视图   它呈现的控制器。如果在显示的视图上调用此方法   但是,控制器本身会自动转发消息   呈现视图控制器。

来自Apple UIViewController上的{{1}}