詳解iPhone下如何擷取對象教程是本文要介紹的內容,主要是講述iPhone下如何擷取對象控制代碼和其父物件控制代碼,很詳細的讓我們去瞭解iphone中的對象,先來看詳細內容。
常規iPhone程式對象結構如下:
- 對象個數 物件類型
-
- 1 UIApplication
- 1 UIApplicationDelegate/subclass
- 1,N UIViewController/subclass
- 1,N UIView/subclsss
儘管有些書上說可以繞過UIViewController直接對UIView進行操作,但個人認為此層的作用用於管理檢視和視圖關係。
下面分別對上述層次關係的物件類型進行學習。說明下,下面學習的東西僅和問題有關,不會全面學習類中的各種方法和屬性。
UIApplication繼承於UIResponder:NSObject
架構:UIKit.framework
標頭檔:UIApplication.h
每一個應用程式都有一個UIApplication或其子類型的執行個體。當程式被載入,函數方法UIApplicationMain就被調用執行,它建立了單件模式的UIApplication對象。之後你可以通過執行sharedApplication類方法來訪問。
看看main函數
- int main(int argc, char *argv[]){
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- int retVal = UIApplicationMain(argc, argv, nil, nil);
- [pool release];
- return retVal;
- }
可以看出,main函數的作用在於調用UIApplicationMain方法來建立一個UIApplication對象執行個體,同時也管理了此類的執行個體的記憶體釋放。
那麼擷取UIApplication對象執行個體,代碼如下:
假設UIApplicationDelegate協議繼承類XXXXAppDelegate
- UIApplication *app = [UIApplication sharedApplication];
- XXXXAppDelegate *d = (XXXXAppDelegate *)app.delegate;
- //Test these code ,it is ok;
在main函數中建立了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實作類別
- UIApplication->
sharedApplication類方法擷取當前程式的UIApplication執行個體
delegate屬性擷取UIApplicationDelegate實作類別的執行個體
windows屬性擷取當前程式涉及到視窗類別數組
keyWindow屬性擷取當前程式關鍵視窗
即然有了UIApplicationDelegate協議的實作類別,那如何?UIViewController/subclass的初始化?
實現Controller類的初始化的地方有兩處:
- application:didFinishLaunchingWithOptions:
- applicationDidFinishLaunching:
這兩個方法,後者是前期版本下的。在iOS3.0以及之後,應該使用前者來完成開始這個過程。XCode4啟動並執行是application:didFinishLaunchingWithOptions:
當然,你也可以刪除application:didFinishLaunchingWithOptions:,自己添加applicationDidFinishLaunching方法來實現。不推薦此操作。
看下實際對UIApplicationDelegate如何編寫其實作類別
- #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 這部分代碼是未測試和說明一個問題的:當前UIApplicationDelegate實作類別中的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
看標頭檔,你發現實作類別,有了兩個屬性,window和viewController;就是儲存當前實作類別所關聯的window和視圖控制器
通過運行,輸出“AppDelegate 'window is UIApplication current keyWindow!”,說明實作類別的window屬性來源UIApplication執行個體當前的keyWindow屬性。
也就是說,如果UIApplication執行個體只有一份UIWindow執行個體,那肯定和其UIApplicationDelegate實作類別的window屬性指向同一UIWindow執行個體。
之所以在UIApplicationDelegate實作類別定義這麼兩個屬性,就是為了更方便的使用UIWindow和UIViewController,作用就是建立對象樹狀關係,便於彼此調用和實現。
在這裡,應該清楚了UIApplication和UIViewController之間是通過UIWinodw來關聯的,儘管在UIApplicationDelegate實作類別中定義一個viewController屬性。修改下上面的關係圖:
常規iPhone程式對象結構如下:
- 對象個數 物件類型
-
- 1 UIApplication
- 1 UIApplicationDelegate/subclass
- 1 UIWindow
- 1 .rootViewController屬性
- 1,N UIViewController/subclass
- 1,N UIView/subclsss
根據現在的對象結構圖,可以知道UIWindow執行個體在此僅僅是起承上啟下的作用。
UIWindow繼承UIView:UIResponder:NSObject
現在可以看下UIViewController