Вам нужно немного лучше понять жизненный цикл объектов.
Объект обычно создается с помощью процесса, состоящего из двух частей.
- выделение - (захват памяти дляобъект и его члены)
- инициализация - (настройка объекта для использования)
Это можно объединить в один шаг с помощью метода класса +new
, который объединяет alloc
и init
.
давайте представим пример класса с именем MyClass
и объект этого класса с именем myObject
.По соглашению классы начинаются с заглавных букв, а объекты начинаются со строчных букв.Так что без дальнейших церемоний, некоторый код:
MyClass * myObject;
, это делает указатель объекта, но не выделяет для него память и не указывает указателю ссылаться на что-либо.
myObject = [[MyClass alloc] init];
это фактически создает экземпляр MyClass
, передает ему сообщение -init
, а затем присваивает возвращаемое значение сообщения init
myObject
.На данный момент счетчик ссылок этого объекта равен 1.
myObject
потенциально может выйти за пределы области, но это само по себе не освобождает память, выделенную во время шага alloc
.
чтобы освободить эту память, объекту необходимо будет передать сообщение об освобождении.
[myObject release];
Эффект освобождения заключается в уменьшении счетчика ссылок, если счетчик ссылок уже равен 1, тогда объектзатем будет передано -dealloc
, указывающее, что оно на самом деле освобождается.
обратно на ваш вопрос ... по сути [self presentModalViewController:home animated:YES];
в итоге вызывает -retain
на home
, так что это не будетуничтожен, пока вы не отклоните модальный контроллер представления.В действительности, когда вы вызываете release или autorelease, вы не освобождаете объект, а просто говорите объекту:
«Эй, ты мне больше не нужен, и если никто больше этого не сделает, то освободи всю памятьчто ты схватил раньше ".