Код в файле .h объявляет две вещи: переменную с именем _animationLayer
, имеющую тип CALayer*
, и свойство с именем animationLayer
, также имеющее тип CALayer*
.Код в файле .m инструктирует компилятору target-c автоматически генерировать геттеры и сеттеры для свойства animationLayer
, используя переменную _animationLayer
для хранения заданного фактического значения.
instance:
_animationLayer = nil; //initialize the variable to nil
self.animationLayer = [[CALayer alloc] init]; //assign a value to the property
NSLog("_animationLayer is: %@", _animationLayer); //it's not set to nil anymore
_animationLayer = nil; //set it to nil again
NSLog("self.animationLayer is: %@", self.animationLayer); //now the property is nil
И вы правы, это имеет некоторое отношение к объекту retainCount (поэтому не совсем корректно рассматривать переменную как прямой псевдоним для свойства).По сути, установка значения непосредственно с помощью переменной _animationLayer
не не сохраняет новое значение и не освобождает старое значение.Установка значения с помощью свойства accessor делает.Например:
_animationLayer = [[CALayer alloc] init]; //retain count is 1
self.animationLayer = nil; //retain count is 0
self.animationLayer = [[CALayer alloc] init]; //oops, retain count is 2
self.animationLayer = nil; //retain count is 1, the object leaked
_animationLayer = [[CALayer alloc] init]; //retain count is 1
[_animationLayer release]; //retain count is 0
self.animationLayer = nil; //oops, just released it again