详解iPhone下如何获取对象一

详解iPhone下如何获取对象教程是本文要介绍的内容,主要是讲述iPhone下如何获取对象句柄和其父对象句柄,很详细的让我们去了解iphone中的对象,先来看详细内容。

常规iPhone程序对象结构如下:

  1. 对象个数 对象类型
  2.            UIApplication
  3.            UIApplicationDelegate/subclass
  4. 1,N          UIViewController/subclass
  5. 1,N          UIView/subclsss

尽管有些书上说可以绕过UIViewController直接对UIView进行操作,但个人认为此层的作用用于管理视图和视图关系。

下面分别对上述层次关系的对象类型进行学习。说明下,下面学习的东西仅和问题有关,不会全面学习类中的各种方法和属性。

UIApplication继承于UIResponderNSObject

框架:UIKit.framework

头文件:UIApplication.h

每一个应用程序都有一个UIApplication或其子类型的实例。当程序被加载,函数方法UIApplicationMain就被调用执行,它创建了单件模式的UIApplication对象。之后你可以通过执行sharedApplication类方法来访问。

看看main函数

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

可以看出,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. This function is called in the main entry point to create the application object and the application delegate and set up the event cycle.
  3. argc: The count of arguments in argv; this usually is the corresponding parameter to main.
  4. argv: variable list of arguments; this usually is the corresponding parameter to main.
  5. principalClassName: The name of the UIApplicationclass or subclass.
  6. 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. #import "NavSmallPhoneAppDelegate.h"
  9. #import "NavSmallPhoneViewController.h"
  10. @implementation NavSmallPhoneAppDelegate
  11. @synthesize window=_window;
  12. @synthesize viewController=_viewController;
  13. @synthesize info;
  14. (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
  15. // Override point for customization after application launch.
  16. selfself.window.rootViewControllerself.viewController;
  17. [self.window makeKeyAndVisible];
  18. //Todo 这部分代码是未测试和说明一个问题的:当前UIApplicationDelegate实现类中的window属性来源哪?
  19. UIWindow *w[UIApplication sharedApplication].keyWindow;
  20. NSLog(@"%@\n%@" ,w ,self.window);
  21. if (w == self.window)
  22. NSLog(@"AppDelegate 'window is UIApplication current keyWindow!");
  23. return YES;}
  24. (void)dealloc{
  25. [_window release];
  26. [_viewController release];
  27. [super dealloc];
  28. }
  29. @end

看头文件,你发现实现类,有了两个属性,windowviewController;就是保存当前实现类所关联的window和视图控制器

通过运行,输出“AppDelegate 'window is UIApplication current keyWindow!”,说明实现类的window属性来源UIApplication实例当前的keyWindow属性。

也就是说,如果UIApplication实例只有一份UIWindow实例,那肯定和其UIApplicationDelegate实现类的window属性指向同一UIWindow实例。

之所以在UIApplicationDelegate实现类定义这么两个属性,就是为了更方便的使用UIWindowUIViewController,作用就是建立对象树状关系,便于彼此调用和实现。

在这里,应该清楚了UIApplicationUIViewController之间是通过UIWinodw来关联的,尽管在UIApplicationDelegate实现类中定义一个viewController属性。修改下上面的关系图:

常规iPhone程序对象结构如下:

  1. 对象个数 对象类型
  2.            UIApplication
  3.            UIApplicationDelegate/subclass
  4.            UIWindow
  5.           .rootViewController属性
  6. 1,N          UIViewController/subclass
  7. 1,N           UIView/subclsss

根据现在的对象结构图,可以知道UIWindow实例在此仅仅是起承上启下的作用。

UIWindow继承UIView:UIResponder:NSObject

现在可以看下UIViewController

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值