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

详解iPhone下如何获取对象二

    博客分类:
  • IOS
 
阅读更多

详解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:didFinishLaunchingWithOptions:  
  • applicationDidFinishLaunching: 

这两个方法,后者是前期版本下的。在iOS3.0以及之后,应该使用前者来完成开始这个过程。XCode4运行的是application:didFinishLaunchingWithOptions:
当然,你也可以删除application:didFinishLaunchingWithOptions:,自己添加applicationDidFinishLaunching方法来实现。不推荐此操作。

看下实际对UIApplicationDelegate如何编写其实现类

  • #import <UIKit/UIKit.h> 
  • @class NavSmallPhoneViewController;  
  • @interface NavSmallPhoneAppDelegate : NSObject <UIApplicationDelegate> {  
  • }  
  • @property (nonatomic, retain) IBOutlet UIWindow *window;  
  • @property (nonatomic, retain) IBOutlet NavSmallPhoneViewController *viewController;  
  • @end  
  •  
  • #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.          
  •           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

继承UIResponder:NSObject

UIViewController其子类UINavigationController和UITabBarController为复杂视图控制器和视图的层次结构提供额外的行为处理功能。

针对问题看下,有哪些视图控制器可访问?

  • parentViewController  property  
  • searchDisplayController  property  
  • splitViewController  property  
  • modalViewController  property  
  • navigationController  property  
  • tabBarController  property 

上述控制器访问器都是只读,说明这些控制器是由内部或初始化就进行处理。

从这里来看,至少可以说明一点,Controller之间的关联是存在的

最关键,怎么去管理视图?

属性view和方法loadView

UIView又如何得到它的操作者?又如何管理自身的子视图?

继承于UIResponder:NSObject

如果UIView包含在UIViewController下,只能顺起获取到对应的UIView,暂时未知如何根据UIView获取UIViewController

UIView关于管理视图层次,如下:

Managing the View Hierarchy

  •   superview  property  
  •   subviews  property  
  •   window  property  
  • – addSubview:  
  • – bringSubviewToFront:  
  • – sendSubviewToBack:  
  • – removeFromSuperview  
  • – insertSubview:atIndex:  
  • – insertSubview:aboveSubview:  
  • – insertSubview:belowSubview:  
  • – exchangeSubviewAtIndex:withSubviewAtIndex:  
  • – isDescendantOfView: 

感觉可以通过属性window来获取Controller,从某一个角度来说,这个Controller应该是当前视图的父对象

文中涉及红色粗体,是本文的相关答案标记,如图:



 

UIView.window属性来源于当前UIApplication.keyWindow

可以通过此属性让UIView间接获取到该视图的UIViewController类。

小结:详解iPhone下如何获取对象教程的内容介绍完了,希望本文对你有所帮助!

分享到:
评论

相关推荐

    详解iphone4

    然而,基于【标题】和【描述】中提到的“详解iphone4”,我们可以从iPhone 4这款产品出发,探讨其相关知识点。 ### iPhone 4知识点详解 #### 设计与外观 iPhone 4是苹果公司在2010年推出的智能手机,它标志着苹果...

    仿Iphone中搜索结果的布局详解

    在iOS系统中,iPhone的搜索结果布局设计是一种直观且用户友好的方式,它允许用户快速查找并访问设备上的信息。本文将深入解析如何在Android平台上实现类似iPhone的搜索结果布局,以提供类似的用户体验。 首先,我们...

    iPhone UIKit详解源代码

    本资源“iPhone UIKit详解源代码”旨在帮助开发者深入理解UIKit的工作原理,从而提升iOS应用的开发水平。 UIKit包含了大量用于创建交互式、动态界面的对象,如UIView、UIViewController、UILabel、UIButton等。让...

    iphone NSBundle 详解

    `bundleForClass:`使用指定类的加载路径创建`NSBundle`,`bundleWithIdentifier:`则根据标识符获取`NSBundle`,`mainBundle`是获取主应用程序的`NSBundle`对象。`allBundles`方法可以获取系统中所有的`NSBundle`对象...

    cocos2d-iphone游戏开发pdf

    《cocos2d-iphone游戏开发》是一本深入讲解如何使用cocos2d框架进行iPhone游戏开发的专业书籍。cocos2d是一个强大的2D游戏开发框架,它为开发者提供了丰富的功能,包括图形渲染、动画系统、物理引擎支持、音频处理等...

    知易 Cocos2D-iPhone 游戏开发教程 004

    ### 知易 Cocos2D-iPhone 游戏开发教程 004:用户输入处理机制详解 #### iPhoneOS的Touch事件与基础知识 在深入探讨Cocos2D-iPhone的游戏开发之前,首先需要理解iPhoneOS如何处理用户的触摸输入。这部分内容主要...

    box2d开发说明(cocos2d for iphone)

    Box2D是一款专为游戏开发设计的二维物理引擎库,它可以帮助开发者实现更加真实的物理效果,提高游戏世界的互动性和真实感。Box2D通过模拟现实世界中的物理现象,如碰撞、重力等,使游戏中的物体能够呈现出更为自然的...

    iPhone开发秘籍:第2版(The iPhone Developer's Cookbook)

    ### iPhone开发秘籍:第2版(The iPhone Developer's Cookbook) #### 书籍概述 《iPhone开发秘籍:第2版》是一本专为iPhone开发者准备的技术指南书籍,它基于第一版进行了全面修订与大量扩充,提供了更为丰富的内容...

    iOS 7:iPhone/iPad应用开发技术详解源码

    本资源包含了"iOS 7:iPhone/iPad应用开发技术详解"这本书的第19章和第20章的源代码,这些章节通常会涵盖特定的主题,帮助开发者深入理解iOS应用的工作原理和最佳实践。 第19章可能涉及的内容: 1. **用户界面(UI...

    iphone内置购买dome

    《iPhone内置购买(Demo)详解:打造你的应用内购系统》 在移动应用开发领域,尤其是iOS平台,内置购买(In-App Purchase, IAP)是开发者常用的盈利手段,允许用户在应用程序内部购买虚拟商品或服务。本篇文章将基于...

    iPhone SDK编程入门经典

    ### iPhone SDK编程入门经典知识点详解 #### 一、iPhone与iOS概述 - **定义与特点**:iPhone是由苹果公司设计并销售的一款智能手机,其操作系统为iOS。iOS是一种基于Unix的操作系统,专为移动设备设计,提供了简洁...

    iphone notification机制导读

    ### iPhone Notification机制详解 #### 一、引言 在iPhone应用程序开发中,Notification(通知)是一种重要的机制,用于实现对象间的解耦通信。通过发送和接收通知,不同的组件可以响应应用内的事件变化,从而实现...

    iphone 4 04.11.08 5.0.1 完美解锁

    随着智能手机技术的发展,苹果公司的iPhone系列一直是消费者追捧的对象之一。对于早期版本的iPhone而言,由于网络锁定的问题,不少用户选择了解锁的方式来获得更自由的使用体验。本文将详细介绍如何利用redsn0w_win_...

    Cocoa Touch for iPhone OS 3

    ### Cocoa Touch for iPhone OS 3 知识点详解 #### 一、概述 《Cocoa Touch for iPhone OS 3》是一本专为iOS开发者撰写的书籍,主要关注于早期版本的iPhone操作系统——iPhone OS 3(现在已演变为iOS)。本书由...

    iphone应用开发面试题库

    《iPhone应用开发面试题库详解》 iPhone应用开发面试中,常常会涉及到一系列技术细节,涵盖通信机制、网络协议、操作系统内存管理以及编程语言特性等多个方面。以下是对这些常见问题的详细解答: 1. **异步通信与...

    一步一步教你如何创建一个iPhone应用

    ### 创建iPhone应用详解 #### 前言 在深入探讨如何创建iPhone应用之前,我们假设读者已经具备了Objective-C的基本知识。此外,请确保从Apple开发者主页下载了名为MoveMe的示例代码,本文将以此为基础进行讲解。 #...

    iPhone手机游戏开发实例

    ### iPhone手机游戏开发实例知识点详解 #### 一、前言 本教材《iPhone手机游戏开发实例》是一本针对iOS平台的iPhone游戏开发指南,旨在通过实际案例帮助读者掌握游戏开发的基本流程和技术要点。本书不仅适合初学者...

Global site tag (gtag.js) - Google Analytics