Objective-C对象相互具有属性

Objective-C对象相互具有属性,objective-c,oop,properties,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; …这样他们

假设我们有两个对象

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

他们互相“了解”有什么不对吗? 也就是说,每一个都可以拥有另一个作为财产吗

在一个神秘的三等舱里这样做可以吗

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;
…这样他们就可以互相调用方法了?我通常不这么做,而是使用消息传递等,但有时这似乎是一个更整洁的解决方案

我很少在示例代码中看到它(也许从来没有),所以我一直回避这样做。有人能告诉我这件事吗?
谢谢

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

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

是的,他们这样互相了解是有问题的。您可能会创建一个retain循环,除非您记得在将最终发布消息发送到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.

相反,如果你们需要能够互相发送消息,可以考虑授权

是的,他们这样互相了解是有问题的。您可能会创建一个retain循环,除非您记得在将最终发布消息发送到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.

相反,如果你们需要能够互相发送消息,可以考虑授权

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

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

你能提供一个真实的例子,说明你试图使用这种“习惯用法”的地方吗?你能提供一个真实的例子,说明你想使用这个“习惯用法”的地方吗?如果我错了,请纠正我,但你所说的只有在@property声明中放入一个“retain”命令时才是真的,否?retain或copy都会引起问题。如果只使用assign,则保留周期没有问题。但我仍然认为您所寻找的与CoCoat到处使用的委托模式有很大关系。不过,垃圾收集应用程序没有问题?@rebo。不,由于GC的工作方式,保留周期在GC应用程序中不是问题。但是mwt通常会问一些与iPhone相关的问题,所以我认为GC不会涉及到之前的评论。在正常情况下,使用copy不会得到retain cycles。如果我错了,请纠正我,但只有在@property声明中使用“retain”命令时,您所说的才是真的,否?retain或copy都会导致问题。如果只使用assign,则保留周期没有问题。但我仍然认为您所寻找的与CoCoat到处使用的委托模式有很大关系。不过,垃圾收集应用程序没有问题?@rebo。不,由于GC的工作方式,保留周期在GC应用程序中不是问题。但是mwt通常会问一些与iPhone相关的问题,所以我认为GC不会涉及到之前的评论。在正常情况下,复制不会产生保留周期。事实证明确实如此,Williham。我最终意识到这两门课真的应该是一门课。事实证明的确如此,Williham。我最终意识到这两门课真的应该是一门课。