详解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:didFinishLaunchingWithOp
tions: - applicationDidFinishLaun
ching:
这两个方法,后者是前期版本下的。在iOS3.0以及之后,应该使用前者来完成开始这个过程。XCode4运行的是application:didFinishLaunchingWithOp
当然,你也可以删除application:didFinishLaunchingWithOp
看下实际对UIApplicationDelegate如何编写其实现类
- #import
<UIKit/UIKit.h> - @class
NavSmallPhoneViewControl ler; - @interface
NavSmallPhoneAppDelegate : NSObject <UIApplicationDelegate> { - }
- @property
(nonatomic, retain) IBOutlet UIWindow *window; - @property
(nonatomic, retain) IBOutlet NavSmallPhoneViewControl ler *viewController; - @end
- #import
"NavSmallPhoneAppDelegate .h" - #import
"NavSmallPhoneViewControl ler.h" - @implementation
NavSmallPhoneAppDelegate - @synthesize
window=_window; - @synthesize
viewController=_viewController; - @synthesize
info; - -
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOp tions:(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;} - -
(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