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

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

  @synthesize searchBar = _searchBar; 

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

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

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

Это эквивалент self.searchBar а не searchBar или эти два одинаковых?

В ваших свойствах почти всегда есть опорная переменная. Какие

 @synthesize searchBar = _searchBar; 

is объявляет, что переменная поддержки для вашей панели поиска будет называться _searchBar . Это позволяет отделить имя свойства от имени вашей переменной. Фактически, если вы не используете @synthesize вам не нужно иметь переменную поддержки вообще.

Что касается того, почему люди делают это, у всех разные причины. Лично я делаю это для

  1. избегать столкновений с именами переменных и
  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]; 

тогда – потому что контекст управляемого объекта создается лениво в методе доступа – вы можете в конечном итоге отправить сообщение в нуль и не получить никаких результатов.

 @synthesize searchBar = _searchBar; 

говорит, чтобы создать метод getter с именем «searchBar» (и т. д.) для переменной экземпляра _searchBar.

Подчеркивание переменной _searchBar обычно означает «Не обращайтесь напрямую, если вы действительно не знаете, что делаете. Вместо этого используйте методы getter и setter!».

  • Objective-C: Как изменить class объекта во время выполнения?
  • Как распределить приложение ios без проводов без управления UDID и перекомпиляции
  • как увеличить размер шрифта в UIWebView
  • Как включить / выключить флэш-память iPhone?
  • Сравните два массива с одинаковым значением, но с другим порядком
  • NSMutableArray addObject не работает
  • UIWebView не масштабирует контент для соответствия
  • Выполнение команды терминала из приложения Cocoa
  • Интеграция CFNetwork и Bonjour для интеграции iPhone и Mac
  • Одновременные распознаватели жестов в Iphone SDK
  • Лучшая библиотека Cocoa / Objective-C Wrapper для SQLite на iPhone
  • Давайте будем гением компьютера.