假设我们有两个对象。
此外,让我们假设他们没有理由相互存在。所以我们不太担心可重用性。
他们彼此“了解”有什么不对吗? 意思是,每个人都可以将另一个作为财产吗?
在神话般的第三课中做这样的事情是否可以:
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;
...以便他们可以互相调用方法?而不是这样做,我通常使用消息传递等,但有时这似乎可能是一个更整洁的解决方案。
我几乎没有在示例代码中看到它(可能永远不会),所以我一直避免这样做。有人可以让我直截了当吗? 谢谢。
答案 0 :(得分:1)
如果你需要这样的模式,可能的情况是两个对象的两个类应该合并;或者说他们彼此发出的任何信息应该被移到你神话般的第三堂课中。
答案 1 :(得分:1)
是的,他们知道彼此是这样的问题。您可能会创建一个保留周期,除非您记得在将最终版本消息发送到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
答案 2 :(得分:1)
这是一种常见模式,控制器知道它控制的视图,视图将操作委托给其控制器。