Особенности использования @property и @synthesize (cocos2d) - PullRequest
0 голосов
/ 16 ноября 2011

Я видел в библиотеках для использования cocos2d странные @property и @ synthesize

Стандарт в примерах записывается следующим образом:

в .ч

CGFloat minimumTouchLengthToSlide; 
}
@property(readwrite, assign) CGFloat minimumTouchLengthToSlide;

дюйм. М

@synthesize minimumTouchLengthToSlide

Но в lib https://github.com/cocos2d/cocos2d-iphone-extensions/tree/master/Extensions/CCScrollLayer и других библиотеках \ extensions

в .ч

CGFloat minimumTouchLengthToSlide_; 
}
@property(readwrite, assign) CGFloat minimumTouchLengthToSlide;

дюйм. М

@synthesize minimumTouchLengthToSlide = minimumTouchLengthToSlide_;

Что означает этот код?

Почему они изменили минимальное значение TouchLengthToSlide на минимальное значение TouchLengthToSlide_ и добавили минимальное значение TouchLengthToSlide = минимальное значение TouchLengthToSlide _;

Ответы [ 2 ]

2 голосов
/ 16 ноября 2011

Рекомендуется называть переменную экземпляра отличной от свойства. Причиной этого является то, что в этом случае вы не можете случайно использовать переменную экземпляра вместо свойства. Это не так важно при использовании типов значений, таких как целые числа и числа с плавающей запятой, но более важно при использовании ссылочных типов в свойствах retain. Рассмотреть свойство

@property (nonatomic, retain) NSString *myString;
...
@synthesize myString;

Компилятор заботится о сохранении строки, когда вы делаете self.myString = someString. Но когда вы пишете myString = someString, вы на самом деле не используете свойство, а вместо этого непосредственно переменную, и сохранение не происходит. Это может привести к появлению зомби, утечек и т. Д. Присвоив переменной экземпляра другое имя, например:

@property (nonatomic, retain) NSString *myString;
...
@synthesize myString = myString_;

вы больше не можете писать myString = someString, потому что это приведет к ошибке компилятора. Если вам нужно использовать переменную экземпляра напрямую, вы всегда можете написать _myString = someString, но на практике это редко требуется.

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

Так что, в основном, это метод, позволяющий избежать ненужных ошибок при обработке свойств (в основном это retain-properties).

0 голосов
/ 16 ноября 2011

@property и @synthesize - это действительно классная функция Objective-C, позволяющая автоматически создавать методы получения и установки.В ваших примерах они создали бы:

- (CGFloat)minimumTouchLengthToSlide и

- (void)setMinimumTouchLengthToSlide:(CGFloat)newLength; бесплатно.

@synthesize minimumTouchLengthToSlide = minimumTouchLengthToSlide_ означает, что они сообщают Objective-C, что когда кто-то пытается получить доступ к этому свойству, он должен указывать на переменную экземпляраустанавливает свойство.Назначить означает, что значение не сохраняется, переменная просто указана.Пример того, как этот метод может выглядеть, может быть таким:

- (void)setMinimumLengthToSlide:(CGFloat)newLength {
    [self willChangeValueForKey:@"minimumLengthToSlide"]; // let observers know this property is changing
    minimumLengthToSlide_ = newLength;

    [self didChangeValueForKey:@"minimumLenghtToSlide"];
}

Подробнее о них можно прочитать здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...