繁体   English   中英

iOS对象或两个控制器之间的委托?

[英]iOS object or delegate between two controllers?

晚上,我的问题充斥着理论。

我了解到从Apple开发人员文档中读取的内容 ,最好是使用委托模式来跟踪某些对象属性。 这样,我们可以访问委托而无需访问对象。 (我真的没有得到这个选择的原因)

我还理解,最好定义: protocolDelegate: class ,当我们在类中声明委托时,最好使用weak词来防止某些“问题循环”。 (??)

因此,当我在玩一些代码时,我发现您不能在两个view controllers之间传递weak delegate ,因为,当然,当您更改控制器时, weak delegate将被删除,因为weak (或者至少这是我的理解)。

因此,我必须在2个选项之间进行选择:

  • 使代表“强”删除weak键。

  • 或将对象传递到segue中并使代表保持weak

我很困惑,你能清除我的想法吗? :D

您所指的循环称为保留循环

让我们用一个具体的例子来解决这个问题:假设您有一个具有UITableViewUIViewController 视图控制器对表视图有很强的引用。 现在,视图控制器希望充当表视图的委托。

现在,如果表视图对其引用具有引用,我们将有以下情况:视图控制器对表视图具有强引用,而表视图又对视图控制器具有强引用。 因此,任何人都无法解除分配。

为了打破这个循环,通常对委托的引用比较薄弱 这允许视图控制器的保留计数最终下降到0,这又可以释放表视图。

您要使用委托的类也应遵循这种模式,并使用对他们的委托的引用。 因此,您应该通过segue传递所需的参考。

我将专注于您问题的第一部分,因为先前的答案已经很好地涵盖了其余部分。

考虑以下情况:您有一个处理某种类型的网络连接的类-它向服务器发送请求并获得响应。 在此类之外,还有一个viewController,它具有一个触发请求的按钮和一个向用户呈现响应的视图。

基本上,网络处理类应该能够一方面从viewController(按下按钮)中获取一些消息,而另一方面将viewController的响应传递给它。 因此,这两个类之间应该存在双向通信。 尽管将buttonPressed消息传递到网络处理类非常明显,但相反的部分(传递响应)则比较棘手,因为网络处理类不应该知道是谁创建的和调用它的(好的OO做法和防止内存泄漏)。

这就是委托模式的用处。它允许对象将数据传递给对它感兴趣的任何人,而无需了解任何有关接收者的信息。 传递响应的类仅知道某个“代理”,而不知道另一个类。 另外,您可以按原样取出网络处理类,并将其放入另一个项目中。 因为它不应该从其原始项目中了解任何其他类,所以只需要一些“委托”,就可以将其放入另一个项目中而无需进行任何修改。

我希望它可以帮助您获得选择的理由。

我认为通过segue传递对象, Segues是在Xcode中使用Storyboard的重要组成部分。 我们可以再次讨论不同类型的segues ,但是本segues向您展示如何使用“ Show” segue,以及如何在两个视图控制器pass data between以使用所需的任何自定义数据来自定义第二个。

您可以轻松使用segues示例; 在下面你可以发送currentstringdestinationViewControllersentstring ,也ShowSegue是你SEGUE identifier

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "ShowSegue" {
        if let destinationVC = segue.destinationViewController as? OtherViewController {
            destinationVC.sentstring = currentstring
        }
    }

}

视图控制器之间的导航会维护视图控制器的stack

例如aVC是firstviewcontroller,那么栈顶将是aVC

现在,当您按入或显示另一个bVCbVC现在statck的顶部是bVC 所以堆栈看起来像

aVC -> bVC(top)

现在您推另一个cVC

aVC -> bVC -> cVC(top)

因此,堆栈的顶部始终对用户可见。

在当前情况下,aVC和bVC和cVC不会取消分配。 他们在记忆中。 但是,如果您弹出或关闭cVC,它将从内存中取消分配,现在您的堆栈顶部看起来像,

aVC -> bVC(top)

因此,视图控制器一直生活在堆栈中,直到没有弹出或将其删除为止。 因此,默认情况下它们是strog参考。

Segue没什么,但是您可以说它们是推送或弹出操作的图形表示。

另一件事是,委托应该是weak ,因为如果强者可以创建保留周期。

在一般意义上,您可以将代表称为representative

现在,如果您正在使用segue,请将对象发送到prepareForsegue ,它将管理其他所有内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM