Что делает @synthesize window = _window?
Я понимаю, что @synthesize window;
в сочетании с @property
"автоматически создает" ваши сеттеры и получатели, но я не уверен, что происходит, когда вы назначаете значение, например
@synthesize searchBar = _searchBar;
Означает ли это, что я могу просто использовать _searchBar вместо этого в своих методах, а не сказать self.searchBar?
Следует ли предотвратить столкновение имен ivar, например, с помощью этого метода делегата:
- (void) searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
Является ли это эквивалентом self.searchBar
, а не searchBar
, или эти два одинаковых?
Ответы
Ответ 1
В ваших свойствах почти всегда есть опорная переменная. Что
@synthesize searchBar = _searchBar;
действительно объявляет, что переменная поддержки для вашей строки поиска будет называться _searchBar
. Это позволяет отделить имя свойства от имени вашей переменной. Фактически, если вы не используете @synthesize
, вам не нужно иметь переменную резервного копирования.
Что касается людей, которые это делают, у всех разные причины. Лично я делаю это для
- избегать столкновений с именами переменных и
- ясно, когда я использую локальную переменную и когда я использую переменную экземпляра.
Ответ 2
Синтаксис описан в документации - см. Директивы по реализации свойств.
Причина изменения имени переменной экземпляра - это именно то, чтобы препятствовать прямому доступу. Символ подчеркивания используется условно. (Примечание. Хотя Правила кодирования в настоящее время предупреждают об использовании подчеркивания, этот совет устарел.)
Снова в документации (см. Использование методов Accessor), кроме методов init и dealloc, вы всегда должны использовать методы доступа. Вы используете блокировки доступа, чтобы обеспечить правильную работу с памятью и при необходимости высылать уведомления об изменениях KVO. Вы используете get accessors, чтобы убедиться, что свойство правильно инициализировано. Существует несколько общих мест, где свойства инициализируются лениво; если вы не используете аксессор, вы получите нуль...
Пример прямого доступа: используя один из шаблонов основных данных, если вы использовали:
NSFetchRequest *request = ...;
NSError *error = nil;
NSArray *results = [__managedObjectContext executeFetchRequest:request error:&error];
вместо
NSArray *results = [self.managedObjectContext executeFetchRequest:request error:&error];
then - потому что контекст управляемого объекта создается лениво в методе доступа - вы можете в конечном итоге отправить сообщение в нуль и не получить никаких результатов.
Ответ 3
@synthesize searchBar = _searchBar;
говорит, что для метода экземпляра _searchBar используется метод getter с именем "searchBar" (и т.д.).
Подчеркивание в переменной _searchBar обычно означает "Не обращайтесь напрямую, если вы действительно не знаете, что вы делаете. Вместо этого используйте методы getter и setter!".