【问题标题】:Objective-C Objects Having Each Other as Properties相互作为属性的 Objective-C 对象
【发布时间】:2011-01-29 08:50:13
【问题描述】:

假设我们有两个对象。

此外,让我们假设他们真的没有理由没有彼此而存在。所以我们不太担心可重用性。

他们“了解”彼此有什么问题吗? 意思是,每个人都可以拥有另一个作为财产吗?

在神话般的三等舱里做这样的事情可以吗:

Foo *f = [[Foo alloc] init];
self.foo = f;
[f release];

Bar *b = [[Bar alloc] init];
self.bar = b;
[b release];

foo.bar = bar;
bar.foo = foo;

...这样他们就可以互相调用方法了吗?我通常不这样做,而是使用消息传递等,但有时这似乎是一个更整洁的解决方案。

我几乎从未在示例代码中看到它(也许永远不会),所以我回避了这样做。有人可以直接告诉我吗? 谢谢。

【问题讨论】:

  • 你能提供一个真实的例子来说明你在哪里想使用这个“成语”吗?

标签: objective-c oop properties


【解决方案1】:

如果你需要这样的模式,很可能是两个对象的两个类应该合并;或者他们中的任何部分互相传递信息都应该移到你神秘的第三类。

【讨论】:

  • 事实证明确实如此,Williham。我最终意识到这两个类确实需要成为一个类。
【解决方案2】:

是的,他们这样相互了解是有问题的。除非您记得在将最终发布消息发送给 f 或 b 之前清除另一个的 foo 或 bar 属性,否则您可能会创建一个保留周期。如果其他人可以访问这些变量,那么您可能不知道何时发送此最终版本,因此您将在保留周期中泄漏内存。

例子:

Mysterious init:
Foo * f = [[Foo alloc] init];  // Foo retain is 1
self.foo = f;                  // Foo retain is 2
[f release];                   // Foo retain is 1

Bar * b = [[Bar alloc] init];  // Bar retain is 1
self.bar = b;                  // Bar retain is 2
[b release];                   // bar retain is 1

self.foo.bar = self.bar;       // Bar retain is 2
self.bar.foo = self.foo;       // Foo retain is 2

Mysterious dealloc:
self.foo = nil;  // Foo retain is 1
self.bar = nil;  // Bar retain is 1
// Foo and Bar are now leaked.

如果您需要能够相互发送消息,请考虑委托。 Cocoa Fundamentals Guide: Delegates and Data Sources

【讨论】:

  • 如果我错了,请纠正我,但是如果我在@property 声明中添加“保留”命令,您所说的才是正确的,不是吗?
  • 保留或复制都会导致问题。如果您只使用分配,则保留周期没有问题。但是我仍然认为您正在寻找的内容与 Cocoa 到处使用的委托模式非常相关
  • 这不是垃圾收集应用程序的问题吗?
  • @rebo。不,由于 GC 的工作方式,保留周期对 GC 应用程序来说不是问题。但是mwt一般会问iPhone相关的问题,所以我觉得这里不涉及GC
  • 更正之前的评论。在正常情况下,您不会获得带有副本的保留周期。
【解决方案3】:

这是一种常见的模式,控制器知道它控制的视图,而视图将操作委托给它的控制器。

【讨论】:

    猜你喜欢
    • 2015-11-12
    • 1970-01-01
    • 2012-02-19
    • 2020-07-14
    • 2012-02-23
    • 2014-03-24
    • 1970-01-01
    • 2013-10-04
    • 2013-04-29
    相关资源
    最近更新 更多