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

#iphone #objective-c #ios #memory-management #nsmutablearray

#iPhone #objective-c #iOS #управление памятью #nsmutablearray

Вопрос:

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

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

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

Комментарии:

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

Ответ №1:

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

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

Комментарии:

1. ага — значит, просто выдать [_myArray release] в методе dealloc — это все, что мне нужно сделать, верно?

Ответ №2:

Самое простое правило — и об этом время от времени упоминалось — заключается в том, что вы должны освобождать только те объекты, которые вы явно выделили (alloc), скопировали (copy), обновили (new) или сохранили (retained). В описанном вами сценарии вы ни за что не несете ответственности. Если ваш метод не выполняет ни одной из четырех вышеупомянутых действий, беспокоиться не о чем.

Ответ №3:

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

Ответ №4:

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

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

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

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

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

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