Сохранять свойства так, как я никогда раньше не видел? - PullRequest
0 голосов
/ 20 марта 2011

Я видел пример кода с этим кодом:

в файле .h:

  CALayer *_animationLayer;
  @property (nonatomic, retain) CALayer *animationLayer;

И в файле .m:

  @synthesize animationLayer = _animationLayer;

IЯ предполагаю, что это связано с счетом удержания?

Может кто-нибудь объяснить это?

Ответы [ 2 ]

2 голосов
/ 20 марта 2011

Считайте, что это псевдоним для имени переменной.

Из Руководства по основам какао :

Синтаксис для @synthesize также включает в себя расширение, которое позволяет вам использовать разные имена для свойство и его экземпляр-переменная место хранения. Рассмотрим, например, следующее утверждение:

@synthesize title, directReports, role = jobDescrip;

Это говорит компьютеру синтезировать методы доступа для свойства title, directReports и role, и использовать jobDescrip переменная экземпляра для поддержки role свойство.

1 голос
/ 20 марта 2011

Код в файле .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
...