`
dcj3sjt126com
  • 浏览: 1825790 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

详解iPhone下如何获取对象一

    博客分类:
  • IOS
 
阅读更多

详解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

  • 大小: 87.5 KB
分享到:
评论

相关推荐

    iPhoneObjective-C基础语法详解

    如果想从事iphone开发的话Objective-C这门语言就不得不学会我们都知道C语言是没有面向对象的而Object-C则是ANSIC的一个严格超集它是具有面向对象的特性的由于IPHONE的成功让这门语言现在非常的火热今天笔者为大家...

    详解iOS应用使用Storyboard布局时的IBOutlet与IBAction

    在图形界面编程时,解决的第一问题就是如何将静态界面与代码关联起来,或者说是代码如何与界面上的对象 通信, 代码如何操作界面上的对象。在iPhone平台上,引入了IBOutlet与IBAction。通过在变量前增加IBOutlet 来...

    iPhone 开发入门 从 C/C++ 语言到 Objective-C 语言

    Objective-C,通常写作ObjC和较少用的Objective C或Obj-C,是扩充C的面向对象编程语言。所以有一定C/C++语言基础理解和掌握Objective-C也会相应的快些。这回,我们将比较着学习 Objective-C语言,掌握其语法并理解其...

    《电动力学(第二版)》(郭硕鸿) 习题答案doc

    Q: 为什么我点的下载下不了,但积分却被扣了 A: 由于下载人数众多,下载服务器做了并发的限制。若发现下载不了,请稍后再试,多次下载是不会重复扣分的. Q: 我的积分不多了,如何获取积分? A: 上传优质资源可以获取...

    iOS指纹登录(TouchID)集成方案详解

    TouchID指纹识别是iPhone 5S设备中增加的一项重大功能.苹果的后续移动设备也相继添加了指纹功能,在实际使用中还是相当方便的,比如快捷登录,快捷支付等等.系统提供了相应框架,使用起来还是比较方便的.使用LAContext...

    详解iOS的数据存储

     1.XML属性列表(plist)归档.  2.Preference(偏好设置).  3.NSKeyedArchiver归档.  4.SQLite3  5.Core Data 应用沙盒 每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录)与其他文件系统隔离.应用...

    Google Android SDK开发范例大全(第3版) 1/5

    影音功能大突破,领先业界的影音播放功能详解。易于阅读的架构设计,边看边学,每个范例均搭配步骤及完成画面。每个范例后面均有扩展学习,在学习范例应用的同时延伸思考。汲取专家经验,指引入门捷径。 移动网络...

    Google Android SDK开发范例大全(第3版) 4/5

    影音功能大突破,领先业界的影音播放功能详解。易于阅读的架构设计,边看边学,每个范例均搭配步骤及完成画面。每个范例后面均有扩展学习,在学习范例应用的同时延伸思考。汲取专家经验,指引入门捷径。 移动网络...

    Google Android SDK开发范例大全(第3版) 3/5

    影音功能大突破,领先业界的影音播放功能详解。易于阅读的架构设计,边看边学,每个范例均搭配步骤及完成画面。每个范例后面均有扩展学习,在学习范例应用的同时延伸思考。汲取专家经验,指引入门捷径。 移动网络...

    Google Android SDK开发范例大全(第3版) 5/5

    影音功能大突破,领先业界的影音播放功能详解。易于阅读的架构设计,边看边学,每个范例均搭配步骤及完成画面。每个范例后面均有扩展学习,在学习范例应用的同时延伸思考。汲取专家经验,指引入门捷径。 移动网络...

Global site tag (gtag.js) - Google Analytics