詳解iPhone下如何獲取對(duì)象教程
詳解iPhone下如何獲取對(duì)象教程是本文要介紹的內(nèi)容,主要是講述iPhone下如何獲取對(duì)象句柄和其父對(duì)象句柄,很詳細(xì)的讓我們?nèi)チ私?strong>iphone中的對(duì)象,先來(lái)看詳細(xì)內(nèi)容。
常規(guī)iPhone程序?qū)ο蠼Y(jié)構(gòu)如下:
- 對(duì)象個(gè)數(shù) 對(duì)象類型
- 1 UIApplication
- 1 UIApplicationDelegate/subclass
- 1,N UIViewController/subclass
- 1,N UIView/subclsss
盡管有些書(shū)上說(shuō)可以繞過(guò)UIViewController直接對(duì)UIView進(jìn)行操作,但個(gè)人認(rèn)為此層的作用用于管理視圖和視圖關(guān)系。
下面分別對(duì)上述層次關(guān)系的對(duì)象類型進(jìn)行學(xué)習(xí)。說(shuō)明下,下面學(xué)習(xí)的東西僅和問(wèn)題有關(guān),不會(huì)全面學(xué)習(xí)類中的各種方法和屬性。
UIApplication繼承于UIResponder:NSObject
框架:UIKit.framework
頭文件:UIApplication.h
每一個(gè)應(yīng)用程序都有一個(gè)UIApplication或其子類型的實(shí)例。當(dāng)程序被加載,函數(shù)方法UIApplicationMain就被調(diào)用執(zhí)行,它創(chuàng)建了單件模式的UIApplication對(duì)象。之后你可以通過(guò)執(zhí)行sharedApplication類方法來(lái)訪問(wèn)。
看看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方法來(lái)創(chuàng)建一個(gè)UIApplication對(duì)象實(shí)例,同時(shí)也管理了此類的實(shí)例的內(nèi)存釋放。
那么獲取UIApplication對(duì)象實(shí)例,代碼如下:
假設(shè)UIApplicationDelegate協(xié)議繼承類XXXXAppDelegate
- UIApplication *app = [UIApplication sharedApplication];
- XXXXAppDelegate *d = (XXXXAppDelegate *)app.delegate;
- //Test these code ,it is ok;
在main函數(shù)中創(chuàng)建了UIApplication實(shí)例,同時(shí)也就綁定了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實(shí)現(xiàn)類
- UIApplication->
sharedApplication類方法獲取當(dāng)前程序的UIApplication實(shí)例
delegate屬性獲取UIApplicationDelegate實(shí)現(xiàn)類的實(shí)例
windows屬性獲取當(dāng)前程序涉及到窗口類數(shù)組
keyWindow屬性獲取當(dāng)前程序關(guān)鍵窗口
即然有了UIApplicationDelegate協(xié)議的實(shí)現(xiàn)類,那如何實(shí)現(xiàn)UIViewController/subclass的初始化?
實(shí)現(xiàn)Controller類的初始化的地方有兩處:
- application:didFinishLaunchingWithOptions:
- applicationDidFinishLaunching:
這兩個(gè)方法,后者是前期版本下的。在iOS3.0以及之后,應(yīng)該使用前者來(lái)完成開(kāi)始這個(gè)過(guò)程。XCode4運(yùn)行的是application:didFinishLaunchingWithOptions:
當(dāng)然,你也可以刪除application:didFinishLaunchingWithOptions:,自己添加applicationDidFinishLaunching方法來(lái)實(shí)現(xiàn)。不推薦此操作。
看下實(shí)際對(duì)UIApplicationDelegate如何編寫(xiě)其實(shí)現(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.
- selfself.window.rootViewController = self.viewController;
- [self.window makeKeyAndVisible];
- //Todo 這部分代碼是未測(cè)試和說(shuō)明一個(gè)問(wèn)題的:當(dāng)前UIApplicationDelegate實(shí)現(xiàn)類中的window屬性來(lái)源哪?
- UIWindow *w = [UIApplication sharedApplication].keyWindow;
- NSLog(@"%@\n%@" ,w ,self.window);
- if (w == self.window)
- NSLog(@"AppDelegate 'window is UIApplication current keyWindow!");
- return YES;}
- /*為了方便閱讀,這里僅保留了需要看的方法。其他自動(dòng)生成的代碼在此移除,看完整的,自己通過(guò)XCode4自動(dòng)生成*/
- - (void)dealloc{
- [_window release];
- [_viewController release];
- [super dealloc];
- }
- @end
看頭文件,你發(fā)現(xiàn)實(shí)現(xiàn)類,有了兩個(gè)屬性,window和viewController;就是保存當(dāng)前實(shí)現(xiàn)類所關(guān)聯(lián)的window和視圖控制器
通過(guò)運(yùn)行,輸出“AppDelegate 'window is UIApplication current keyWindow!”,說(shuō)明實(shí)現(xiàn)類的window屬性來(lái)源UIApplication實(shí)例當(dāng)前的keyWindow屬性。
也就是說(shuō),如果UIApplication實(shí)例只有一份UIWindow實(shí)例,那肯定和其UIApplicationDelegate實(shí)現(xiàn)類的window屬性指向同一UIWindow實(shí)例。
之所以在UIApplicationDelegate實(shí)現(xiàn)類定義這么兩個(gè)屬性,就是為了更方便的使用UIWindow和UIViewController,作用就是建立對(duì)象樹(shù)狀關(guān)系,便于彼此調(diào)用和實(shí)現(xiàn)。
在這里,應(yīng)該清楚了UIApplication和UIViewController之間是通過(guò)UIWinodw來(lái)關(guān)聯(lián)的,盡管在UIApplicationDelegate實(shí)現(xiàn)類中定義一個(gè)viewController屬性。修改下上面的關(guān)系圖:
常規(guī)iPhone程序?qū)ο蠼Y(jié)構(gòu)如下:
- 對(duì)象個(gè)數(shù) 對(duì)象類型
- 1 UIApplication
- 1 UIApplicationDelegate/subclass
- 1 UIWindow
- 1 .rootViewController屬性
- 1,N UIViewController/subclass
- 1,N UIView/subclsss
根據(jù)現(xiàn)在的對(duì)象結(jié)構(gòu)圖,可以知道UIWindow實(shí)例在此僅僅是起承上啟下的作用。
UIWindow繼承UIView:UIResponder:NSObject
現(xiàn)在可以看下UIViewController
#p#
繼承UIResponder:NSObject
UIViewController其子類UINavigationController和UITabBarController為復(fù)雜視圖控制器和視圖的層次結(jié)構(gòu)提供額外的行為處理功能。
針對(duì)問(wèn)題看下,有哪些視圖控制器可訪問(wèn)?
- parentViewController property
- searchDisplayController property
- splitViewController property
- modalViewController property
- navigationController property
- tabBarController property
上述控制器訪問(wèn)器都是只讀,說(shuō)明這些控制器是由內(nèi)部或初始化就進(jìn)行處理。
從這里來(lái)看,至少可以說(shuō)明一點(diǎn),Controller之間的關(guān)聯(lián)是存在的
最關(guān)鍵,怎么去管理視圖?
屬性view和方法loadView
UIView又如何得到它的操作者?又如何管理自身的子視圖?
繼承于UIResponder:NSObject
如果UIView包含在UIViewController下,只能順起獲取到對(duì)應(yīng)的UIView,暫時(shí)未知如何根據(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:
感覺(jué)可以通過(guò)屬性window來(lái)獲取Controller,從某一個(gè)角度來(lái)說(shuō),這個(gè)Controller應(yīng)該是當(dāng)前視圖的父對(duì)象
文中涉及紅色粗體,是本文的相關(guān)答案標(biāo)記,如圖:
UIView.window屬性來(lái)源于當(dāng)前UIApplication.keyWindow
可以通過(guò)此屬性讓UIView間接獲取到該視圖的UIViewController類。
小結(jié):詳解iPhone下如何獲取對(duì)象教程的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!