Я прочитал, что dealloc для объекта будет называться, только если сохранить счетчик этого объекта становится равным нулю.
Да.
Для простоты вызовите класс, который содержит 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 и свободной памяти. В случае, если у ребенка есть счет сохранения больше одного, вы вызываете утечку памяти.
Надеюсь, это поможет.
Редактировать
Для получения дополнительной информации вы можете прочитать About Memory Management. Так как iOS 5 Apple представила ARC. Автоматический подсчет ссылок - это механизм, который обеспечивает автоматическое управление памятью объектов Objective-C. Для информации см. Transitioning to ARC Release Notes.
Здравствуйте, Flex, Большое спасибо за ваш ответ. – karthick
Добро пожаловать! –