Я прочитал, что Deloc для объекта будет вызываться, только если сохранить
отсчет этого объекта становится равным нулю.
Да.
Ради простоты назовите класс, который содержит currentColor
объект, как ColorContainer
. Теперь, если вы создадите экземпляр ColorContainer
, как показано ниже:
ColorContainer* containerColor = [[ColorContainer alloc] init]; // retain count + 1
счет удержания для containerColor
становится равным 1.
Предположим, вы создаете экземпляр UIColor
и устанавливаете для этого экземпляра свойство currentColor
. В этом случае вы можете следовать двумя разными способами.
В первом случае вы можете создать экземпляр, подобный следующему. Если вы используете метод экземпляра, такой как initWithRed:green:blue:alpha:
, вы должны явно освободить память.
UIColor color* = [[UIColor alloc] initWithRed:0 green:0 blue:0 alpha:1]; // retain count + 1
containerColor.currentColor = color; // retain count +1, the referenced object has a retain count of 2 because you use a retain policy
[color release]; // retain count -1, now the referenced object has a retain count of 1
Вторым способом вместо этого вы можете использовать метод класса (+ символ). В этом случае вам не нужно освобождать объем памяти, поскольку объект, созданный в этом методе класса, будет автоматически освобожден в определенный момент времени жизни вашего приложения.
containerColor.currentColor = [UIColor whiteColor]; // retain count +1
Теперь предположим, что вы освободили containerColor
объект. Если счет сохранения для containerColor
равен 1, освобождая его от объекта, который его использует, он позволяет вызвать его метод dealloc и, как следствие, удалить также объект, на который ссылается currentColor
.
В этом простом примере вы должны отметить, что объект, на который ссылается currentColor
, полностью удаляется из памяти (удаляется), только если он имеет счет сохранения 1. Фактически, если вы сделаете это
UIColor color* = [[UIColor alloc] initWithRed:0 green:0 blue:0 alpha:1]; // retain count + 1
containerColor.currentColor = color; // retain count +1, the referenced object has a retain count of 2
//[color release];
вы создаете утечку памяти (вы понимаете путь?).
Подводя итог, когда вы используете retain
, copy
, init
или new
(то же самое, что alloc-init
), вы всегда должны вызывать их коллеги release
или autorelease
.
Как правило, во избежание утечек памяти всегда нужно балансировать количество сохраняемых объектов.
Итак, в качестве метафоры вы можете думать в памяти, как дерево. Предположим, у вас есть родитель (containerColor
) и ребенок (currentColor
). Если родительский объект (с сохранением количества 1) освобождается, он вызывает его метод dealloc и освобождает память для своего объекта. Если в его методе dealloc вы освобождаете дочерний элемент (с счетом сохранения 1), это вызывает вызов его метода dealloc и свободной памяти. В случае, если количество дочерних элементов превышает один, вы можете вызвать утечку памяти.
Надеюсь, это поможет.
Редактировать
Для получения дополнительной информации вы можете прочитать Об управлении памятью . Начиная с iOS 5 Apple представила ARC. Автоматический подсчет ссылок - это механизм компиляции, который обеспечивает автоматическое управление памятью объектов Objective-C. Для получения информации см. Переход к примечаниям к выпуску ARC .