UIApplication详解
生活随笔
收集整理的這篇文章主要介紹了
UIApplication详解
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
常規(guī)iPhone程序?qū)ο蠼Y(jié)構(gòu)如下:
對象個數(shù)??? ??? 對象類型
1??? ??? UIApplication
1??? ??? ??? UIApplicationDelegate/subclass
1,N??? ??? ??? ??? ??? UIViewController/subclass
1,N??? ??? ??? ??? ??? ??? ??? ??? ??? UIView/subclsss
盡管有些書上說可以繞過UIViewController直接對UIView進(jìn)行操作,但個人認(rèn)為此層的作用用于管理視圖和視圖關(guān)系
下面分別對上述層次關(guān)系的對象類型進(jìn)行學(xué)習(xí)。說明下,下面學(xué)習(xí)的東西僅和問題有關(guān),不會全面學(xué)習(xí)類中的各種方法和屬性。
UIApplication
繼承于UIResponder:NSObject
框架:UIKit.framework
頭文件:UIApplication.h
每一個應(yīng)用程序都有一個UIApplication或其子類型的實例。當(dāng)程序被加載,函數(shù)方法UIApplicationMain就被調(diào)用執(zhí)行,它創(chuàng)建了單件模式的UIApplication對象。之后你可以通過執(zhí)行sharedApplication類方法來訪問。
看看main函數(shù)
int main(int argc, char *argv[]) {NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];int retVal = UIApplicationMain(argc, argv, nil, nil);[pool release];return retVal; }
可以看出,main函數(shù)的作用在于調(diào)用UIApplicationMain方法來創(chuàng)建一個UIApplication對象實例,同時也管理了此類的實例的內(nèi)存釋放。
那么獲取UIApplication對象實例,代碼如下:
假設(shè)UIApplicationDelegate協(xié)議繼承類XXXXAppDelegate
UIApplication *app = [UIApplication sharedApplication];
XXXXAppDelegate *d = (XXXXAppDelegate *)app.delegate;
//Test these code ,it is ok;
在main函數(shù)中創(chuàng)建了UIApplication實例,同時也就綁定了XXXXAppDelegate
看看原型
??? int UIApplicationMain ( int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName );
??? This function is called in the main entry point to create the application object and the application delegate and set up the event cycle.
??? argc: The count of arguments in argv; this usually is the corresponding parameter to main.
??? argv: A variable list of arguments; this usually is the corresponding parameter to main.
??? principalClassName: The name of the UIApplicationclass or subclass.
??? delegateClassName: The name of the class from which the application delegate is instantiated.
UIApplication部分:
UIApplicationMain->
??? UIApplication
??? UIApplicationDelegate實現(xiàn)類
UIApplication->
??? sharedApplication類方法獲取當(dāng)前程序的UIApplication實例
??? delegate屬性獲取UIApplicationDelegate實現(xiàn)類的實例
??? windows屬性獲取當(dāng)前程序涉及到窗口類數(shù)組
??? keyWindow屬性獲取當(dāng)前程序關(guān)鍵窗口
即然有了UIApplicationDelegate協(xié)議的實現(xiàn)類,那如何實現(xiàn)UIViewController/subclass的初始化?
實現(xiàn)Controller類的初始化的地方有兩處:
application:didFinishLaunchingWithOptions:
applicationDidFinishLaunching:
這兩個方法,后者是前期版本下的。在iOS3.0以及之后,應(yīng)該使用前者來完成開始這個過程。XCode4運行的是application:didFinishLaunchingWithOptions:
當(dāng)然,你也可以刪除application:didFinishLaunchingWithOptions:,自己添加applicationDidFinishLaunching方法來實現(xiàn)。不推薦此操作。
看下實際對UIApplicationDelegate如何編寫其實現(xiàn)類
#import <UIKit/UIKit.h>@class NavSmallPhoneViewController;@interface NavSmallPhoneAppDelegate : NSObject <UIApplicationDelegate> {}@property (nonatomic, retain) IBOutlet UIWindow *window;@property (nonatomic, retain) IBOutlet NavSmallPhoneViewController *viewController; @end
#import "NavSmallPhoneAppDelegate.h"#import "NavSmallPhoneViewController.h"@implementation NavSmallPhoneAppDelegate@synthesize window=_window;@synthesize viewController=_viewController;@synthesize info;- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// Override point for customization after application launch. self.window.rootViewController = self.viewController;[self.window makeKeyAndVisible];//Todo 這部分代碼是未測試和說明一個問題的:當(dāng)前UIApplicationDelegate實現(xiàn)類中的window屬性來源哪? UIWindow *w = [UIApplication sharedApplication].keyWindow;NSLog(@"%@\n%@" ,w ,self.window);if (w == self.window)NSLog(@"AppDelegate 'window is UIApplication current keyWindow!");return YES; }/* 為了方便閱讀,這里僅保留了需要看的方法。其他自動生成的代碼在此移除,看完整的,自己通過XCode4自動生成 */- (void)dealloc {[_window release];[_viewController release];[super dealloc]; }@end
看頭文件,你發(fā)現(xiàn) 實現(xiàn)類,有了兩個屬性,window和viewController;就是保存當(dāng)前實現(xiàn)類所關(guān)聯(lián)的window和視圖控制器
通過運行,輸出“AppDelegate 'window is UIApplication current keyWindow!”, 說明實現(xiàn)類的window屬性來源UIApplication實例當(dāng)前的keyWindow屬性。
也就是說,如果UIApplication實例只有一份UIWindow實例,那肯定和其UIApplicationDelegate實現(xiàn)類的window屬性指向同一UIWindow實例。
之所以在UIApplicationDelegate實現(xiàn)類定義這么兩個屬性,就是為了更方便的使用UIWindow和UIViewController,作用就是建立對象樹狀關(guān)系,便于彼此調(diào)用和實現(xiàn)。
在這里,應(yīng)該清楚了UIApplication和UIViewController之間是通過UIWinodw來關(guān)聯(lián)的,盡管在UIApplicationDelegate實現(xiàn)類中定義一個viewController屬性。修改下上面的關(guān)系圖:
常規(guī)iPhone程序?qū)ο蠼Y(jié)構(gòu)如下:
對象個數(shù)??? ??? 對象類型
1??? ??? UIApplication
1??? ??? ??? UIApplicationDelegate/subclass
1??? ??? ??? ??? ??? ???? UIWindow
1??? ??? ??? ??? ??? ??? ? . rootViewController屬性
1,N??? ??? ??? ??? ??? ??? ??? ??? ??? UIViewController/subclass
1,N??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? UIView/subclsss
根據(jù)現(xiàn)在的對象結(jié)構(gòu)圖,可以知道UIWindow實例在此僅僅是起承上啟下的作用。
UIWindow繼承UIView:UIResponder:NSObject
現(xiàn)在可以看下 UIViewController
繼承UIResponder:NSObject
UIViewController其子類UINavigationController和UITabBarController為復(fù)雜視圖控制器和視圖的層次結(jié)構(gòu)提供額外的行為處理功能。
針對問題看下,有哪些視圖控制器可訪問?
? parentViewController? property
? searchDisplayController? property
? splitViewController? property
? modalViewController? property
? navigationController? property
? tabBarController? property
??
? 上述控制器訪問器都是只讀,說明這些控制器是由內(nèi)部或初始化就進(jìn)行處理。
? 從這里來看,至少可以說明一點,Controller之間的關(guān)聯(lián)是存在的~~
??
最關(guān)鍵,怎么去管理視圖?
屬性view和方法loadView
UIView又如何得到它的操作者?又如何管理自身的子視圖?
繼承于UIResponder:NSObject
如果UIView包含在UIViewController下,只能順起獲取到對應(yīng)的UIView,暫時未知如何根據(jù)UIView獲取UIViewController
UIView關(guān)于管理視圖層次,如下:
Managing the View Hierarchy
?????? superview? property
?????? subviews? property
?????? window? property
??? – addSubview:
??? – bringSubviewToFront:
??? – sendSubviewToBack:
??? – removeFromSuperview
??? – insertSubview:atIndex:
??? – insertSubview:aboveSubview:
??? – insertSubview:belowSubview:
??? – exchangeSubviewAtIndex:withSubviewAtIndex:
??? – isDescendantOfView:
????
感覺可以通過屬性window來獲取Controller,從某一個角度來說,這個Controller應(yīng)該是當(dāng)前視圖的父對象
=======================================================================================================
UIView.window屬性來源于當(dāng)前UIApplication.keyWindow
可以通過此屬性讓UIView間接獲取到該視圖的UIViewController類
文中涉及紅色粗體,是本文的相關(guān)答案標(biāo)記。
1??? ??? UIApplication
1??? ??? ??? UIApplicationDelegate/subclass
1,N??? ??? ??? ??? ??? UIViewController/subclass
1,N??? ??? ??? ??? ??? ??? ??? ??? ??? UIView/subclsss
盡管有些書上說可以繞過UIViewController直接對UIView進(jìn)行操作,但個人認(rèn)為此層的作用用于管理視圖和視圖關(guān)系
下面分別對上述層次關(guān)系的對象類型進(jìn)行學(xué)習(xí)。說明下,下面學(xué)習(xí)的東西僅和問題有關(guān),不會全面學(xué)習(xí)類中的各種方法和屬性。
UIApplication
繼承于UIResponder:NSObject
框架:UIKit.framework
頭文件:UIApplication.h
每一個應(yīng)用程序都有一個UIApplication或其子類型的實例。當(dāng)程序被加載,函數(shù)方法UIApplicationMain就被調(diào)用執(zhí)行,它創(chuàng)建了單件模式的UIApplication對象。之后你可以通過執(zhí)行sharedApplication類方法來訪問。
看看main函數(shù)
int main(int argc, char *argv[]) {NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];int retVal = UIApplicationMain(argc, argv, nil, nil);[pool release];return retVal; }
可以看出,main函數(shù)的作用在于調(diào)用UIApplicationMain方法來創(chuàng)建一個UIApplication對象實例,同時也管理了此類的實例的內(nèi)存釋放。
那么獲取UIApplication對象實例,代碼如下:
假設(shè)UIApplicationDelegate協(xié)議繼承類XXXXAppDelegate
UIApplication *app = [UIApplication sharedApplication];
XXXXAppDelegate *d = (XXXXAppDelegate *)app.delegate;
//Test these code ,it is ok;
在main函數(shù)中創(chuàng)建了UIApplication實例,同時也就綁定了XXXXAppDelegate
看看原型
??? int UIApplicationMain ( int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName );
??? This function is called in the main entry point to create the application object and the application delegate and set up the event cycle.
??? argc: The count of arguments in argv; this usually is the corresponding parameter to main.
??? argv: A variable list of arguments; this usually is the corresponding parameter to main.
??? principalClassName: The name of the UIApplicationclass or subclass.
??? delegateClassName: The name of the class from which the application delegate is instantiated.
UIApplication部分:
UIApplicationMain->
??? UIApplication
??? UIApplicationDelegate實現(xiàn)類
UIApplication->
??? sharedApplication類方法獲取當(dāng)前程序的UIApplication實例
??? delegate屬性獲取UIApplicationDelegate實現(xiàn)類的實例
??? windows屬性獲取當(dāng)前程序涉及到窗口類數(shù)組
??? keyWindow屬性獲取當(dāng)前程序關(guān)鍵窗口
即然有了UIApplicationDelegate協(xié)議的實現(xiàn)類,那如何實現(xiàn)UIViewController/subclass的初始化?
實現(xiàn)Controller類的初始化的地方有兩處:
application:didFinishLaunchingWithOptions:
applicationDidFinishLaunching:
這兩個方法,后者是前期版本下的。在iOS3.0以及之后,應(yīng)該使用前者來完成開始這個過程。XCode4運行的是application:didFinishLaunchingWithOptions:
當(dāng)然,你也可以刪除application:didFinishLaunchingWithOptions:,自己添加applicationDidFinishLaunching方法來實現(xiàn)。不推薦此操作。
看下實際對UIApplicationDelegate如何編寫其實現(xiàn)類
#import <UIKit/UIKit.h>@class NavSmallPhoneViewController;@interface NavSmallPhoneAppDelegate : NSObject <UIApplicationDelegate> {}@property (nonatomic, retain) IBOutlet UIWindow *window;@property (nonatomic, retain) IBOutlet NavSmallPhoneViewController *viewController; @end
#import "NavSmallPhoneAppDelegate.h"#import "NavSmallPhoneViewController.h"@implementation NavSmallPhoneAppDelegate@synthesize window=_window;@synthesize viewController=_viewController;@synthesize info;- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// Override point for customization after application launch. self.window.rootViewController = self.viewController;[self.window makeKeyAndVisible];//Todo 這部分代碼是未測試和說明一個問題的:當(dāng)前UIApplicationDelegate實現(xiàn)類中的window屬性來源哪? UIWindow *w = [UIApplication sharedApplication].keyWindow;NSLog(@"%@\n%@" ,w ,self.window);if (w == self.window)NSLog(@"AppDelegate 'window is UIApplication current keyWindow!");return YES; }/* 為了方便閱讀,這里僅保留了需要看的方法。其他自動生成的代碼在此移除,看完整的,自己通過XCode4自動生成 */- (void)dealloc {[_window release];[_viewController release];[super dealloc]; }@end
看頭文件,你發(fā)現(xiàn) 實現(xiàn)類,有了兩個屬性,window和viewController;就是保存當(dāng)前實現(xiàn)類所關(guān)聯(lián)的window和視圖控制器
通過運行,輸出“AppDelegate 'window is UIApplication current keyWindow!”, 說明實現(xiàn)類的window屬性來源UIApplication實例當(dāng)前的keyWindow屬性。
也就是說,如果UIApplication實例只有一份UIWindow實例,那肯定和其UIApplicationDelegate實現(xiàn)類的window屬性指向同一UIWindow實例。
之所以在UIApplicationDelegate實現(xiàn)類定義這么兩個屬性,就是為了更方便的使用UIWindow和UIViewController,作用就是建立對象樹狀關(guān)系,便于彼此調(diào)用和實現(xiàn)。
在這里,應(yīng)該清楚了UIApplication和UIViewController之間是通過UIWinodw來關(guān)聯(lián)的,盡管在UIApplicationDelegate實現(xiàn)類中定義一個viewController屬性。修改下上面的關(guān)系圖:
常規(guī)iPhone程序?qū)ο蠼Y(jié)構(gòu)如下:
對象個數(shù)??? ??? 對象類型
1??? ??? UIApplication
1??? ??? ??? UIApplicationDelegate/subclass
1??? ??? ??? ??? ??? ???? UIWindow
1??? ??? ??? ??? ??? ??? ? . rootViewController屬性
1,N??? ??? ??? ??? ??? ??? ??? ??? ??? UIViewController/subclass
1,N??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? UIView/subclsss
根據(jù)現(xiàn)在的對象結(jié)構(gòu)圖,可以知道UIWindow實例在此僅僅是起承上啟下的作用。
UIWindow繼承UIView:UIResponder:NSObject
現(xiàn)在可以看下 UIViewController
繼承UIResponder:NSObject
UIViewController其子類UINavigationController和UITabBarController為復(fù)雜視圖控制器和視圖的層次結(jié)構(gòu)提供額外的行為處理功能。
針對問題看下,有哪些視圖控制器可訪問?
? parentViewController? property
? searchDisplayController? property
? splitViewController? property
? modalViewController? property
? navigationController? property
? tabBarController? property
??
? 上述控制器訪問器都是只讀,說明這些控制器是由內(nèi)部或初始化就進(jìn)行處理。
? 從這里來看,至少可以說明一點,Controller之間的關(guān)聯(lián)是存在的~~
??
最關(guān)鍵,怎么去管理視圖?
屬性view和方法loadView
UIView又如何得到它的操作者?又如何管理自身的子視圖?
繼承于UIResponder:NSObject
如果UIView包含在UIViewController下,只能順起獲取到對應(yīng)的UIView,暫時未知如何根據(jù)UIView獲取UIViewController
UIView關(guān)于管理視圖層次,如下:
Managing the View Hierarchy
?????? superview? property
?????? subviews? property
?????? window? property
??? – addSubview:
??? – bringSubviewToFront:
??? – sendSubviewToBack:
??? – removeFromSuperview
??? – insertSubview:atIndex:
??? – insertSubview:aboveSubview:
??? – insertSubview:belowSubview:
??? – exchangeSubviewAtIndex:withSubviewAtIndex:
??? – isDescendantOfView:
????
感覺可以通過屬性window來獲取Controller,從某一個角度來說,這個Controller應(yīng)該是當(dāng)前視圖的父對象
=======================================================================================================
UIView.window屬性來源于當(dāng)前UIApplication.keyWindow
可以通過此屬性讓UIView間接獲取到該視圖的UIViewController類
文中涉及紅色粗體,是本文的相關(guān)答案標(biāo)記。
總結(jié)
以上是生活随笔為你收集整理的UIApplication详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS框架介绍之coreImage
- 下一篇: 曾致2死3伤 特斯拉潮州事故鉴定结果已出