Почему _window доступен без указания UIWindow * _window?

Это следующий вопрос: зачем переименовывать синтезированные свойства в iOS с ведущими подчеркиваниями?

в MyDelegate.h

 #import <UIKit/UIKit.h> @interface MyAppDelegate @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) MyMainViewController *mainViewController; @end 

в MyDelegate.m

 #import "MyAppDelegate.h" @implementation MyAppDelegate @synthesize window = _window; @synthesize mainViewController = _mainViewController; 

Кроме того, что объясняется в первоначальном вопросе о пользе префикса _ , мне интересно, почему _window доступен

 @synthesize window = _window; 

без какого-либо определения, прежде чем он будет использоваться в первый раз?

Это и декларация, и определение. Директива @synthesize способна создавать как методы доступа, так и переменные экземпляра. Из TOCPL «Объявленные свойства: директивы по реализации объектов» :

Вы можете использовать property=ivar form property=ivar чтобы указать, что для свойства должна использоваться конкретная переменная экземпляра …
Для современных сред выполнения (см. «Версии среды выполнения и платформы» в Руководстве по программированию времени Objective-C) переменные экземпляра синтезируются по мере необходимости. Если переменная экземпляра с тем же именем уже существует, она используется.

Так что, если у вас уже было объявление об иваре,

 @interface MyAppDelegate : NSObject { NSWindow * _window; } 

(и это требовалось на «старой» платформе). В противном случае он создается директивой @synthesize . Результат в классе одинаковый в любом случае, хотя следует отметить, что синтезированные переменные создаются так, как если бы они были объявлены с @private директивы @private ; подклассы могут получить доступ к свойству, но не к ivar напрямую. Больше исследований на неповторимой какао с любовью: динамические ивары: решение хрупкой проблемы базового класса .

  @synthesize window = _window; 

Это определено там. Это говорит, вы знаете, что свойство, о котором я говорил, было вызвано window , ну, в фоновом режиме, сделайте это ivar под названием _window , так что, если кто-то типа

 window = blah blah 

Это дает ошибку компилятора.

Это предотвращает доступ к ivar напрямую случайно вместо использования синтезированных аксессуаров.

  • iOS: дополнительное пространство внизу UITableView
  • Как написать текст на iOS изображения?
  • Как дать предупреждение, когда спецификаторы формата ошибочно передаются методу
  • Запретить очистку переменных экземпляра в памяти
  • не удалось изменить размер шрифта в UILabel
  • Почему значение count count становится 3 после выделения вида и добавления его в другое представление?
  • Ошибка Hpple - "_OBJC_CLASS _ $ _ TFHpple"
  • Вертикальное выравнивание текста в основном тексте
  • Objective-c - обновление NSFetchedResultController?
  • Построение NSInvocation с блочным аргументом
  • изменение ориентации на iPad испортило прикосновения
  • Interesting Posts
    Давайте будем гением компьютера.