Когда вы добавляете объект в массив, он вызывает retain
для этого объекта. Если вы не отпустите указатель на этот объект, это будет утечка. Когда вы освобождаете массив, он вызовет release
для всех объектов, которые он содержит, так как ранее он вызывал retain
.
Что касается autorelease vs release, то единственный способ узнать наверняка (кроме возможного чтения документации) - по названию метода. В целом, я считаю, что если вы не выделяете объект, вы не несете ответственности за его освобождение.
Что касается методов создания объектов, все вспомогательные методы (array:
, arrayWithObjects:
, arrayWithArray:
и т. Д.) Возвращают автоматически выпущенные объекты. Однако соответствующие им методы init (init:
, initWithObjects:
, initWithArray:
и т. Д.) Этого не делают - если вы их вызываете, вы отвечаете за вызов release
для возвращаемого объекта.
Кажется, я вспомнил еще несколько вопросов на эту тему здесь - вы можете попытаться найти более подробное объяснение.