久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

iphone下,如何獲取對(duì)象的句柄和其父對(duì)象的句柄,?

 quasiceo 2015-04-23
努力學(xué)習(xí)著......

iphone下,,如何獲取對(duì)象的句柄和其父對(duì)象的句柄,?

【問(wèn)題】iphone下,如何獲取對(duì)象的句柄和其父對(duì)象的句柄,?

常規(guī)iPhone程序?qū)ο蠼Y(jié)構(gòu)如下:
對(duì)象個(gè)數(shù)        對(duì)象類(lèi)型
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ì)象類(lèi)型進(jìn)行學(xué)習(xí)。說(shuō)明下,,下面學(xué)習(xí)的東西僅和問(wèn)題有關(guān),,不會(huì)全面學(xué)習(xí)類(lèi)中的各種方法和屬性。

UIApplication

繼承于UIResponder:NSObject

框架:UIKit.framework

頭文件:UIApplication.h

每一個(gè)應(yīng)用程序都有一個(gè)UIApplication或其子類(lèi)型的實(shí)例,。當(dāng)程序被加載,,函數(shù)方法UIApplicationMain就被調(diào)用執(zhí)行,它創(chuàng)建了單件模式的UIApplication對(duì)象,。之后你可以通過(guò)執(zhí)行sharedApplication類(lèi)方法來(lái)訪問(wèn),。

看看main函數(shù)
復(fù)制代碼
int main(int argc, char *argv[])
{
NSAutoreleasePool
*pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}
復(fù)制代碼


可以看出,main函數(shù)的作用在于調(diào)用UIApplicationMain方法來(lái)創(chuàng)建一個(gè)UIApplication對(duì)象實(shí)例,,同時(shí)也管理了此類(lèi)的實(shí)例的內(nèi)存釋放,。

那么獲取UIApplication對(duì)象實(shí)例,代碼如下:
假設(shè)UIApplicationDelegate協(xié)議繼承類(lèi)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)類(lèi)

UIApplication->
    sharedApplication類(lèi)方法獲取當(dāng)前程序的UIApplication實(shí)例
    delegate屬性獲取UIApplicationDelegate實(shí)現(xiàn)類(lèi)的實(shí)例
    windows屬性獲取當(dāng)前程序涉及到窗口類(lèi)數(shù)組
    keyWindow屬性獲取當(dāng)前程序關(guān)鍵窗口

即然有了UIApplicationDelegate協(xié)議的實(shí)現(xiàn)類(lèi),,那如何實(shí)現(xiàn)UIViewController/subclass的初始化?

實(shí)現(xiàn)Controller類(lèi)的初始化的地方有兩處:
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)類(lèi)
復(fù)制代碼
#import <UIKit/UIKit.h>

@class NavSmallPhoneViewController;

@interface NavSmallPhoneAppDelegate : NSObject <UIApplicationDelegate> {

}

@property (nonatomic, retain) IBOutlet UIWindow
*window;

@property (nonatomic, retain) IBOutlet NavSmallPhoneViewController
*viewController;
@end
復(fù)制代碼


復(fù)制代碼
#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 這部分代碼是未測(cè)試和說(shuō)明一個(gè)問(wèn)題的:當(dāng)前UIApplicationDelegate實(shí)現(xiàn)類(lèi)中的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ù)制代碼


看頭文件,你發(fā)現(xiàn)實(shí)現(xiàn)類(lèi),,有了兩個(gè)屬性,,window和viewController;就是保存當(dāng)前實(shí)現(xiàn)類(lèi)所關(guān)聯(lián)的window和視圖控制器
通過(guò)運(yùn)行,,輸出“AppDelegate 'window is UIApplication current keyWindow!”,,說(shuō)明實(shí)現(xiàn)類(lèi)的window屬性來(lái)源UIApplication實(shí)例當(dāng)前的keyWindow屬性,。
也就是說(shuō),如果UIApplication實(shí)例只有一份UIWindow實(shí)例,,那肯定和其UIApplicationDelegate實(shí)現(xiàn)類(lèi)的window屬性指向同一UIWindow實(shí)例,。

之所以在UIApplicationDelegate實(shí)現(xiàn)類(lèi)定義這么兩個(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)類(lèi)中定義一個(gè)viewController屬性。修改下上面的關(guān)系圖:
常規(guī)iPhone程序?qū)ο蠼Y(jié)構(gòu)如下:
對(duì)象個(gè)數(shù)        對(duì)象類(lèi)型
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
繼承UIResponder:NSObject

UIViewController其子類(lèi)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類(lèi)








無(wú)論生活、還是技術(shù),,一切都不斷的學(xué)習(xí)和更新~~~努力~
分類(lèi): 其他編程

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多