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
的东西(或者至少这是我的理解)。
所以,我必须在两个选项中做出选择:
使委托 "strong" 删除 weak
键。
或者在 segue 中传递对象并保持委托为 weak
。
我有很多困惑,你能帮我理清思路吗? :D
我认为通过 segue 传递对象,Segues
是在 Xcode 中使用故事板的一个非常重要的部分。我们可以再讨论一下不同类型的 segues
,但是这一次向您展示了如何使用“Show”segue,以及如何 pass data between
两个视图控制器来自定义第二个视图控制器需要任何自定义数据。
您可以轻松使用segues示例;在下面你可以发送 currentstring
到 destinationViewController
inside sentstring
, ShowSegue
也是你的 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',它可以被放入另一个项目而无需任何修改。
希望能帮助你找到选择的理由
晚上,我的问题全是理论。
我从 Apple 开发人员文档 中了解到,最好使用 Delegates Pattern 来跟踪某些对象属性。这样我们就可以在不访问对象的情况下访问委托。 (我真的没明白这个选择的原因)
我也明白最好定义:protocolDelegate: class
当我们在 class 中声明委托时,最好使用 weak
词来防止某些 "kind of problem cycle"。 (??)
所以,当我玩代码时,我发现你不能在两个 view controllers
之间传递 weak delegate
,因为当然,当你改变控制器时, weak delegate
将被删除,因为它是 weak
的东西(或者至少这是我的理解)。
所以,我必须在两个选项中做出选择:
使委托 "strong" 删除
weak
键。或者在 segue 中传递对象并保持委托为
weak
。
我有很多困惑,你能帮我理清思路吗? :D
我认为通过 segue 传递对象,Segues
是在 Xcode 中使用故事板的一个非常重要的部分。我们可以再讨论一下不同类型的 segues
,但是这一次向您展示了如何使用“Show”segue,以及如何 pass data between
两个视图控制器来自定义第二个视图控制器需要任何自定义数据。
您可以轻松使用segues示例;在下面你可以发送 currentstring
到 destinationViewController
inside sentstring
, ShowSegue
也是你的 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',它可以被放入另一个项目而无需任何修改。
希望能帮助你找到选择的理由