как справочная копия обрабатывается в Objective-C? - PullRequest
0 голосов
/ 09 июня 2010

График объекта

      [Instance A]
         tree
       /       \
      /         \
     /           \
    ↓             ↓
[Instance B]     [Instance C]
 apple              bug

Вопрос

Экземпляр A должен ссылаться на копии для Экземпляр B и Экземпляр C .

Если я сохраню или отпущу Экземпляр A , в котором есть ссылки на два других экземпляра, что произойдет с различными ссылками?

Ответы [ 3 ]

1 голос
/ 09 июня 2010

Когда вы сохраняете или отпускаете A, изменяется только счетчик ссылок. Что происходит с B и C, зависит от вашей модели и реализации.

Если A «владеет» или нуждается в хранении B / C, он должен сохранить его в какой-то момент (независимо от того, сохраняется ли сам A) и освободить его при освобождении A.

Если вы не внедряете A, вам нужно проверить документацию, чтобы узнать, принадлежит ли он B / C или вам нужно явно сохранить и выпустить их.

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

1 голос
/ 09 июня 2010

Вы не заботитесь о сохранении счета .Нет, честно говоря, нет.Вы заботитесь только о том, владеет ли A B и C (или, точнее, имеет долю в владении B и C).

Так что, вероятно, где-то у вас есть метод, который устанавливает дочерние элементы A (это может бытьОбозначенный инициализатор).Если этот метод сохраняет B и C, то A должен освободить B и / или C, когда он больше не нуждается во владении.Это может произойти в двух случаях:

  1. , когда B и / или C должны быть перезаписаны новыми дочерними элементами
  2. Когда A собирается быть освобожденным

Во всяком случае, сказав это, чтобы ответить на ваш вопрос:

Если вы сохраняете A, это не влияет на количество сохраняемых B и C.

Если вы отпускаете A, это не влияет наколичество сохраняемых B и C , если только никто не владеет A. В этом случае будет вызываться dealloc A, который освободит и B, и C.

0 голосов
/ 09 июня 2010

Когда вы вызываете retain или release для objectA, ничего не произойдет с объектами, которые содержат ссылку на objectA.(Если вы не переопределили эти методы.) (Сохранение увеличивает количество сохранений и освобождение уменьшает количество сохраняемых счетов)

В случае освобождения, если счет сохранения равен 0, вызывается dealloc и освобождается объект A.И вы несете ответственность за освобождение выделенных объектов класса.Другие объекты, которые все еще содержат ссылку на объект A, становятся висящими указателями.

С уважением, Дхана.

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