2014-09-23 22 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

代碼:(Objective-C) @synthesize window = _window;

它表示爲名爲window的屬性合成getter和setter,並將該屬性與名爲_window的實例變量(不必在其他地方單獨聲明)關聯。 Apple希望你通過合成的setter和getter來設置和檢索實例變量的值。也就是說,寫這樣的東西:

代碼:(Objective-C) [window makeKeyAndVisible];

將失敗,因爲沒有名爲window的實例變量。相反,您必須直接通過名稱命名實例變量;即,

代碼:(Objective-C) [_window makeKeyAndVisible];

,或者使用訪問方法:

代碼:(目標C) [self.window makeKeyAndVisible];

實例變量現在通常是私有的,這意味着它們不能被子類直接按名稱訪問。因此,子類別無選擇,只能使用繼承的訪問器方法來訪問它們的值。請記住,合成的方法可能會基於它們的屬性(例如,保留,複製,非原子)進行額外的工作,這些工作將直接分配給實例變量或從實例變量中檢索值時不會發生。所以在屬性和實例變量之間有一個額外的抽象層次。

+0

這裏self.window,窗口行爲像方法ya實例變量.. ??? – 2014-09-23 09:31:08

+0

@synthesize window = _window – 2014-09-23 09:32:12

+0

如果在現代鏗鏘聲中自動完成,爲什麼還會有人使用@synthesis? – Andy 2014-09-23 10:08:32

0

因爲屬性getter執行特殊的功能,而不是僅僅返回_window

here:如果您的應用程序的Info.plist 文件包含UIMainStoryboardFile關鍵

這個屬性的實現是必需的。幸運的是,Xcode 項目模板通常會自動爲應用程序委託包含 屬性的合成聲明。此 綜合屬性的默認值爲零,這會導致該應用程序創建一個通用的UIWindow對象並將其分配給該屬性。如果您想爲您的應用程序提供 自定義窗口,則必須實現此屬性的getter方法 ,並使用它來創建並返回您的自定義窗口。

相關問題