если метод принимает объекты и добавляет их в массив, должен ли он обнаруживать и освобождать объект при необходимости? - PullRequest
1 голос
/ 25 мая 2011

Если у меня есть вспомогательный метод, который добавляет объект в массив (NSMutableArray) в моем пользовательском классе, имеет ли смысл сделать либо:

  1. каким-то образом автоматически определять, был ли входящий объект уже автоматически освобожден? тогда если не освободить его после добавления в массив?
  2. в dealloc перебирает все объекты в массиве и каким-то образом проверяет, что их не нужно освобождать, а затем после этого освобождает сам массив?

Меня беспокоит, когда мне приходится освобождать свой пользовательский класс, включая массив, как мне узнать состояние объектов в массиве?

Ответы [ 4 ]

4 голосов
/ 25 мая 2011

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

т.е. вам не нужно делать ничего особенного - просто добавьте объекты в ваш массив.

3 голосов
/ 25 мая 2011

Самое простое правило - и об этом упоминалось время от времени - это то, что вы должны освобождать только те объекты, которые вы явно выделяли (размещали), копировали (копировали), обновляли (новые) или сохраняли сохранить). В описанном вами сценарии вы ни за что не несете ответственности. Если ваш метод не выполняет ни одну из четырех вышеупомянутых задач, беспокоиться не о чем.

2 голосов
/ 25 мая 2011

Вы ничего не делаете в методе (кроме методов доступа) для обработки памяти других объектов.Это вся идея владения объектом;поскольку ваш метод не владеет объектом, который вы передаете, он не должен иметь дело с памятью этого объекта.NSMutableArray будет иметь дело с объектами, которые он содержит, когда он освобожден, вам не нужно выполнять какую-либо работу, кроме как освобождать массив, когда вы закончите с ним.

0 голосов
/ 25 мая 2011

каким-то образом автоматически определять, был ли входящий объект уже автоматически освобожден?затем, если не освободить его после добавления его в массив?

нет - коллекции сохраняют добавленные объекты, а затем освобождают их, когда они удаляются

в dealloc итерациивсе объекты в массиве и каким-то образом проверяют, что они не должны быть освобождены, а затем после этого освобождает сам массив?

нет - коллекции сохраняют объекты, которые они добавляют, а затем освобождают их, когда ониудалено

Когда я должен освободить свой пользовательский класс, включая массив, меня беспокоит вопрос, как узнать состояние объектов в массиве?

коллекция позаботится об этом и сохранит ссылку на объект, пока он находится в коллекции.Вы (конечно) несете ответственность за вызов release в самом массиве, когда объект, который его содержит, удаляет или заменяет его (например, в dealloc).

...