Objective-C对象彼此作为属性

时间:2010-03-19 08:14:01

标签: objective-c oop properties

假设我们有两个对象。

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

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

在神话般的第三课中做这样的事情是否可以:

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;

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

我几乎没有在示例代码中看到它(可能永远不会),所以我一直避免这样做。有人可以让我直截了当吗? 谢谢。

3 个答案:

答案 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)

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