Подтвердить что ты не робот

Что делает @synthesize window = _window?

Я понимаю, что @synthesize window; в сочетании с @property "автоматически создает" ваши сеттеры и получатели, но я не уверен, что происходит, когда вы назначаете значение, например

 @synthesize searchBar = _searchBar;

Означает ли это, что я могу просто использовать _searchBar вместо этого в своих методах, а не сказать self.searchBar?

Следует ли предотвратить столкновение имен ivar, например, с помощью этого метода делегата:

- (void) searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText

Является ли это эквивалентом self.searchBar, а не searchBar, или эти два одинаковых?

4b9b3361

Ответ 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!".