Объекты Objective C, имеющие друг друга как свойства - PullRequest
0 голосов
/ 19 марта 2010

Допустим, у нас есть два объекта.

Кроме того, давайте предположим, что у них действительно нет причин существовать друг без друга. Поэтому мы не слишком беспокоимся о возможности повторного использования.

Что-то не так с ними, "зная друг о друге"? То есть каждый может иметь другого как собственность?

Можно ли делать что-то подобное в мифическом третьем классе:

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 ]

1 голос
/ 19 марта 2010

Да, проблема в том, что они знают друг о друге вот так. Скорее всего, вы создадите цикл сохранения, если не забудете очистить свойство foo или bar другого, прежде чем отправлять сообщение об окончательном выпуске либо в f, либо в b. Если кто-то еще сможет получить доступ к этим переменным, вы, вероятно, не будете знать, когда отправляется этот окончательный выпуск, и поэтому вы потеряете память с циклом сохранения.

Пример:

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.

Вместо этого посмотрите на делегирование, если вам нужно иметь возможность отправлять сообщения друг другу. Руководство по основам какао: делегаты и источники данных

1 голос
/ 19 марта 2010

Это обычный шаблон, когда контроллеру известно представление, которым он управляет, и представление делегирует операции своему контроллеру.

1 голос
/ 19 марта 2010

Если вам нужен такой шаблон, скорее всего, два класса двух объектов должны быть объединены; или что любая часть этих сообщений друг друга должна быть перемещена в ваш мифический третий класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...