詳解iPhone下如何擷取對象教程(1)

來源:互聯網
上載者:User

詳解iPhone下如何擷取對象教程是本文要介紹的內容,主要是講述iPhone下如何擷取對象控制代碼和其父物件控制代碼,很詳細的讓我們去瞭解iphone中的對象,先來看詳細內容。

常規iPhone程式對象結構如下:

 
  1. 對象個數        物件類型  
  2.  
  3. 1            UIApplication  
  4. 1            UIApplicationDelegate/subclass  
  5. 1,N          UIViewController/subclass  
  6. 1,N          UIView/subclsss 

儘管有些書上說可以繞過UIViewController直接對UIView進行操作,但個人認為此層的作用用於管理檢視和視圖關係。

下面分別對上述層次關係的物件類型進行學習。說明下,下面學習的東西僅和問題有關,不會全面學習類中的各種方法和屬性。

UIApplication繼承於UIResponder:NSObject

架構:UIKit.framework

標頭檔:UIApplication.h

每一個應用程式都有一個UIApplication或其子類型的執行個體。當程式被載入,函數方法UIApplicationMain就被調用執行,它建立了單件模式的UIApplication對象。之後你可以通過執行sharedApplication類方法來訪問。

看看main函數

 
  1. int main(int argc, char *argv[]){      
  2. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  
  3.     int retVal = UIApplicationMain(argc, argv, nil, nil);  
  4.     [pool release];  
  5.   return retVal;  

可以看出,main函數的作用在於調用UIApplicationMain方法來建立一個UIApplication對象執行個體,同時也管理了此類的執行個體的記憶體釋放。

那麼擷取UIApplication對象執行個體,代碼如下:

假設UIApplicationDelegate協議繼承類XXXXAppDelegate

 
  1. UIApplication *app = [UIApplication sharedApplication];  
  2. XXXXAppDelegate *d = (XXXXAppDelegate *)app.delegate;  
  3. //Test these code ,it is ok; 

在main函數中建立了UIApplication執行個體,同時也就綁定了XXXXAppDelegate

看看原型

 
  1. int UIApplicationMain ( int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName );  
  2.  
  3. This function is called in the main entry point to create the application object and the application delegate and set up the event cycle.  
  4.  
  5. argc: The count of arguments in argv; this usually is the corresponding parameter to main.  
  6.  
  7. argv: A variable list of arguments; this usually is the corresponding parameter to main.  
  8.  
  9. principalClassName: The name of the UIApplicationclass or subclass.  
  10.  
  11. delegateClassName: The name of the class from which the application delegate is instantiated. 

UIApplication部分:

 
  1. UIApplicationMain-> 
  2.     UIApplication 

UIApplicationDelegate實作類別

 
  1. UIApplication-> 

sharedApplication類方法擷取當前程式的UIApplication執行個體

delegate屬性擷取UIApplicationDelegate實作類別的執行個體

windows屬性擷取當前程式涉及到視窗類別數組

keyWindow屬性擷取當前程式關鍵視窗

即然有了UIApplicationDelegate協議的實作類別,那如何?UIViewController/subclass的初始化?

實現Controller類的初始化的地方有兩處:

 
  1. application:didFinishLaunchingWithOptions:  
  2. applicationDidFinishLaunching: 

這兩個方法,後者是前期版本下的。在iOS3.0以及之後,應該使用前者來完成開始這個過程。XCode4啟動並執行是application:didFinishLaunchingWithOptions:
當然,你也可以刪除application:didFinishLaunchingWithOptions:,自己添加applicationDidFinishLaunching方法來實現。不推薦此操作。

看下實際對UIApplicationDelegate如何編寫其實作類別

 
  1. #import <UIKit/UIKit.h> 
  2. @class NavSmallPhoneViewController;  
  3. @interface NavSmallPhoneAppDelegate : NSObject <UIApplicationDelegate> {  
  4. }  
  5. @property (nonatomic, retain) IBOutlet UIWindow *window;  
  6. @property (nonatomic, retain) IBOutlet NavSmallPhoneViewController *viewController;  
  7. @end  
  8.  
  9. #import "NavSmallPhoneAppDelegate.h"  
  10. #import "NavSmallPhoneViewController.h"  
  11. @implementation NavSmallPhoneAppDelegate  
  12. @synthesize window=_window;  
  13. @synthesize viewController=_viewController;  
  14. @synthesize info;  
  15. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{      
  16.           // Override point for customization after application launch.          
  17.           selfself.window.rootViewController = self.viewController;      
  18.           [self.window makeKeyAndVisible];         
  19.           //Todo 這部分代碼是未測試和說明一個問題的:當前UIApplicationDelegate實作類別中的window屬性來源哪?      
  20.           UIWindow *w = [UIApplication sharedApplication].keyWindow;      
  21.           NSLog(@"%@\n%@" ,w ,self.window);      
  22.           if (w == self.window)          
  23.           NSLog(@"AppDelegate 'window is UIApplication current keyWindow!");         
  24.           return YES;}  
  25.           /*為了方便閱讀,這裡僅保留了需要看的方法。其他自動產生的程式碼在此移除,看完整的,自己通過XCode4自動產生*/  
  26.           - (void)dealloc{      
  27.           [_window release];      
  28.           [_viewController release];      
  29.           [super dealloc];  
  30.   }  
  31. @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. 對象個數        物件類型  
  2.  
  3. 1         UIApplication  
  4. 1            UIApplicationDelegate/subclass  
  5. 1            UIWindow  
  6. 1           .rootViewController屬性  
  7. 1,N          UIViewController/subclass  
  8. 1,N           UIView/subclsss 

根據現在的對象結構圖,可以知道UIWindow執行個體在此僅僅是起承上啟下的作用。

UIWindow繼承UIView:UIResponder:NSObject

現在可以看下UIViewController


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.