Пока не выпущен self.view
, все эти ярлыки продолжают существовать. Ваш код выделяет память и инициализирует объект, а затем передает право собственности на объект вашему представлению. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Когда вы не используете права доступа к ним, ваша release
означает, что у вас не будет права владения ими, поэтому система будет свободна от них избавиться: ваша release
сама не избавится от объектов. (Я добавил иллюстрацию ниже на случай, если она не ясна.)
Это не просто проблема с памятью, потому что объект UILabel имеет всевозможные дополнительные издержки: свои дюжину свойств и методов, несколько дюжин свойств и методов, которые он наследует от UIView, еще дюжину, унаследованных от UIResponder, и более еще десяток от UIObject. В результате UILabel может делать все изящные вещи: иметь цвета, тени и альфа-прозрачность, управлять переносом слов, подключать распознаватели жестов, быть анимированным и иметь собственные подпредставления и т. Д.
Для более легкого решения вы можете нарисовать тот же текст, используя метод drawInRect:withFont:
NSString (который он получает из своих UIKit Additions ). Ничего из того, что UILabel накладных расходов, хотя ни один из его тонкостей, либо. Тем не менее, с небольшим усилием он должен делать именно то, что вы хотите.
Это, вероятно, излишнее, но иллюстрация:

Ваш ViewController выделяет и инициализирует View . В памяти есть одна копия View, и ViewController сохраняет право собственности на View до тех пор, пока вы (скорее всего) не отпустите ViewController в его методе dealloc
(если только вы не выпустите его вручную ранее).
Ваш ViewController выделяет и инициализирует Метка . В памяти имеется одна копия метки, и ViewController сохраняет за собой право собственности на метку.
Вызывая метод addView
представления, вы добавляете владение метки к представлению (в дополнение к указанию на отображение метки). В памяти по-прежнему есть одна копия метки, которой владеют два объекта.
Вызывая метод Label release
, ViewController отказывается от владения Label. В памяти по-прежнему есть одна копия метки, и View по-прежнему принадлежит ей.
Вы повторяете шаги 2 - 4 каждый раз в цикле, при этом View каждый раз сохраняет владение выделенной меткой.
Каждый раз, когда приложение достигает конца своего цикла выполнения (что происходит снова и снова во время работы приложения), если есть какие-либо выделенные объекты , у которых нет владельца , тогда память, используемая для их хранения, освобождается. Поскольку вашему представлению по-прежнему принадлежат все эти метки, память, выделенная для них, продолжает использоваться.