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

iOS object or delegate between two controllers?

晚上,我的问题全是理论。

我从 Apple 开发人员文档 中了解到,最好使用 Delegates Pattern 来跟踪某些对象属性。这样我们就可以在不访问对象的情况下访问委托。 (我真的没明白这个选择的原因)

我也明白最好定义:protocolDelegate: class 当我们在 class 中声明委托时,最好使用 weak 词来防止某些 "kind of problem cycle"。 (??)

所以,当我玩代码时,我发现你不能在两个 view controllers 之间传递 weak delegate,因为当然,当你改变控制器时, weak delegate 将被删除,因为它是 weak 的东西(或者至少这是我的理解)。

所以,我必须在两个选项中做出选择:

我有很多困惑,你能帮我理清思路吗? :D

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

您可以轻松使用segues示例;在下面你可以发送 currentstringdestinationViewController inside sentstringShowSegue 也是你的 segue identifier

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

}

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

让我们用一个具体的例子来说明这一点:假设你有一个 UIViewController,它有一个 UITableView。视图控制器对 table 视图有很强的引用。视图控制器现在想充当 table 视图的委托。

现在,如果 table 视图对其委托具有 strong 引用,我们将遇到以下情况:视图控制器对table 视图,而 table 视图又会对视图控制器有很强的引用。因此两者都不能被释放。

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

您想要使用委托的 类 也应遵循此模式并使用 weak 对其委托的引用。因此,您应该通过您的 segue 传递所需的引用。

viewcontroller 之间的导航保持 stack viewcontroller 秒。

例如 aVC 首先是 viewcontroller 然后堆栈顶部将是 aVC,

现在,当您按下或显示另一个 viewcontroller 时,说 bVC 那么现在 statck 的顶部是 bVC。所以堆栈看起来像,

aVC -> bVC(top)

现在你推另一个cVC然后,

aVC -> bVC -> cVC(top).

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

在当前情况下,aVC 和 bVC 以及 cVC 没有被释放。他们在记忆中。但是如果你弹出或关闭 cVC,那么它将从内存中释放,现在你的堆栈顶部看起来像,

aVC -> bVC(top).

所以 viewcontrollers 存在于堆栈中,直到它们不被弹出或移除。因此,它们默认是 strog 引用。

Segue 没什么,但你可以说它们是压入或弹出操作的图形表示。

另一件事是委托应该是 weak,因为如果它们很强,它可以创建保留循环。

一般意义上的representative可以调用delegate

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

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

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

基本上,网络处理 class 一方面应该能够从 viewController(按下按钮)获取一些消息,另一方面将响应传递给 viewController。所以两个classes之间应该是双向通信的。虽然将 buttonPressed 消息传递给网络处理 class 非常明显,但反向部分(传递响应)有点棘手,因为网络处理 class 不应该知道是谁创建的它以及调用它的人(良好的 OO 实践和内存泄漏预防)。

这就是委托模式的用武之地。它允许对象将数据传递给对其感兴趣的任何人,而无需对接收者一无所知。通过响应的 class 只知道一些 'delegate' 而不知道另一个 class。此外,您可以按原样取出网络处理 class 并将其放在另一个项目中。因为它不应该从它的原始项目中知道任何其他 class,只有一些 'delegate',它可以被放入另一个项目而无需任何修改。

希望能帮助你找到选择的理由