2014-09-23 2 views
1
@interface Student 
{ 
    UIWindow* _window; 
} 
@property (weak,readwrite) UIWindow *window; 
@end 

#import "Student.h" 
@implementation Student 
@synthesize window; 

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 

    [self.window makeKeyAndVisible];//here why self.window ,why not use _window 

    [_window makeKeyAndVisible]; 
} 

Вот почему self.window, почему бы не использовать _window ._window также содержать * окно, то почему мы не используем _window, чтобы сделать вызов makeKeyAndVisible сообщения о том _window ,Почему self.window, почему бы не использовать _window

ответ

1

Код: (Цель-C) @synthesize window = _window;

Он говорит, что синтезирует геттеры и сеттеры для свойства с именем window и связывает это свойство с переменной экземпляра, называемой _window (которая не должна быть отдельно объявлена ​​в другом месте). Apple хочет, чтобы вы установили и извлекли значение переменной экземпляра через синтезированные сеттеры и геттеры. То есть, написав что-то вроде этого:

Код: (Objective-C) [window makeKeyAndVisible];

не будет работать, так как нет имени переменной с именем. Вместо этого вы должны либо называть переменную экземпляра непосредственно своим именем; то есть

Код: (Цель-C) [_window makeKeyAndVisible];

или использовать метод доступа:

код: (Objective-C) [self.window makeKeyAndVisible];

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

+0

здесь self.window, окно действовать как способ ya экземпляр переменной .. ??? –

+0

@synthesize window = _window –

+0

Почему кто-то все еще использует @synthesis, если это делается автоматически в современном clang? – Andy

0

Поскольку свойство геттер выполняет специальные функции и не только возвращение _window:

От here:

Реализация этого свойства требуется, если Info.plist файл вашего приложения содержит ключ UIMainStoryboardFile. К счастью, шаблоны проектов Xcode обычно включают в себя синтезированное объявление свойства для делегата приложения. Значение по умолчанию этого синтезируемого свойства равно nil, что заставляет приложение создавать общий объект UIWindow и назначать его этому свойству. Если вы хотите предоставить пользовательское окно для вашего приложения, вы должны реализовать метод getter этого свойства и использовать его для создания и возврата своего пользовательского окна.

Смежные вопросы