AppDelegate.h
代码------------------------------------------------------------------------------------------------------------------------------------------------
#import <UIKit/UIKit.h>
@class RootViewController;
代码------------------------------------------------------------------------------------------------------------------------------------------------
//#import与@class的区别代码------------------------------------------------------------------------------------------------------------------------------------------------
@interface AppDelegate : NSObject <UIApplicationDelegate>
代码------------------------------------------------------------------------------------------------------------------------------------------------
//类定义从@interface开始,它表示了类的接口声明,冒号后指定了该类的父类,@end;表示类定义结束。
//Objective-c的类定义中类的变量定义与方法定义是分开的,花括号内写变量的定义,花括号外写该类的方法定义。方法定义比较独特,具体格式如下:
//- (void) setName : (NSString) input;
//方法类型 返回类型 方法名称 方法接受参数 参数类型 参数名
//通用格式如下:
//+/- (返回类型) 名子1:(类型1) 参数1 名子2:(类型2) 参数2 ...
//前面带有减号(-) 的方法为实例方法,必须使用类的实例才可以调用的。
//对应的有+号, 代表是类的静态方法,不需要实例化即可调用。
//NSObject
//NSObject是大多数Objective-C类的继承的根类;它没有父类。通过NSObject,其它类继承了一些基础的与Objective-C语言编译器系统之间的接口,并且获得了在它的实例中表现为一个对象的能力。
//尽管NSObject不是一个严格的抽象类,实际上它已经是一个类。但是通过它自己一个除了表现为一个简单类之外,NSObject实际上几乎无法完成任何有用的操作。为你的程序添加任何属性(attributes)并制定实现逻辑,你必须创建一个或者多个从NSObject继承或者父类从NSObject继承的类(class)。
//NSObject采用(adopts,或者说是继承实现)了NSObject协议(protocol)(见“Root Class—and Protocol”(第67页) ) 。NSObject协议(protocol)允许被多个根类(root class)采用,比如NSProxy另一根类(root class),并不是从NSObject继承,但却也采用了NSObject协议(protocol)所以它在Objective-C中便有了和NSObject类相似部分的类的定义(interface)和功能。
//NSObject根类,和采用了NSObject协议或者其它根类协议(“root” protocols)一道,为所有的非代理(non-proxy)Cocoa对象指定了以下的定义(interface)和特有的事件:
//Allocation, initialization, 和 duplication。一些NSObject方法(包括一些采用的协议)用来处理创建(creation),初始化(initialization)和复制(duplication)对象。
//alloc和allocWithZone:方法在内存中为一个对象分配了内存空间并且设置它指向的对象的编译器类定义(即是告诉编译器定义了一个类,译者注)。
//init方法为对象的属性初始化(prototype),一个让实例变量初始化状态的进程。类方法中的initialize和load让一个类有机会初始化它们自己。
//new一种方便的结合分配内存和初始化的方法。
//copy和copyWithZone:方法复制任意对象的内存的实现方法(从NSCopying协议来的);mutableCopy和mutableCopyWithZone:(在NSMutableCopying协议中定义)将被应用于(mplemented by)该类来完成不定的对象拷贝(make mutable copies of their objects)。
//Object retention and disposa(对象的保留和释放)。接下来的方法对于面向对象的程序尤其的重要,那就是如何传统的,明确的,形式化的(traditional, and explicit, form)实现内存管理。
//retain方法,增加对象的计数器。
//release方法,减少对象的计数器
//autorelease方法,自动减少对象的计数器,但是以推迟的方式来实现。
//retainCount方法,返回一个对象当前的计数器
// dealloc方法应用于类来释放对象实例变量并释放动态内存。
// Introspection 和 comparison(反省机制和对比机制).许多NSObject方法使你能够让编译器查询一个对象。反省方法(introspection methods)帮助你探查一个对象在类继承机制中的位置,决定是否实现一些方法,并测试它是否遵循一些协议。而一些类仅是有一些方法。
//superclass和class方法(类和实例(class and instance))分别返回接收器的父类和类,作为一个Class对象。
// isKindOfClass:和isMemberOfClass:,通过这两种方法可以确定一个类的从属关系。后者测试一个接收器是否是一个指定类的实例;而后者可以测试类的从属关系。
// respondsToSelector: 方法测试一个接收器是否通过selector实现(implements)了一个标志符话的方法。而instancesRespondToSelector:测试了一个给定的类实例化之后(这个消息的接收方法为静态方法,译者注)是否实现了一个指定的方法。
//conformsToProtocol:方法,测试接收器(对象或者类)符合一个给定的协议(protocol)。
// isEqual: 和 hash方法,用于对象比较。
// description方法,允许一个对象返回一个字符串来描述它的内容;这个常用于调试debugging (“print object”命令 ) 。通过“%@”以字符串输出特殊的指定对象。(即是以NSLog的形式输出,译者注)
// Object encoding and decoding(对象的编码和解码).接下来的方法将与对象的编码和解码方式有关 (作为一个归档处理的一部分):
//encodeWithCoder: 和 initWithCoder:方法,NSCoding协议中仅有的组成成员。第一个允许对象编译它的实例变量,第二个允许一个对象初始化它自身的解码实例变量。
//NSObject类声明了一些与对象编码相关的其它方法,有:classForCoder,replacementObjectForCoder:,和awakeAfterUsingCoder:
// Message forwarding(消息转发). forwardInvocation:允许一个对象把消息转发给另一个对象。
// Message dispatch(消息配送). 一个以performSelector...为开头的方法允许你配送消息(message)直到指定的延迟后,并且可以从二级线程((synchronously or asynchronously)同步或者不同步地)配送消息到主线程。
//NSObject拥有许多其它的方法,比如版本和传递的类方法(class methods for versioning and posing)(之后将为你展示如何将一个类本身编译为另一个类)。它既包括了方法让你访问编译器数据结构的类,比如selector方法和函数指针形式的方法实现。
// UIApplication是iPhone应用程序的开始并且负责初始化并显示 UIWindow,并负责加载应用程序的第一个UIView到UIWindow窗体中。UIApplication的另一个任务是帮助管理应用程序的生命 周期,而UIApplication通过一个名字为UIApplicationDelegate的代理类来履行这个任务。尽管UIApplication 会负责接收事件,而UIApplicationDelegate则决定应用程序如何去响应这些事件,UIApplicationDelegate可以处理 的事件包括应用程序的生命周期事件(比如程序启动和关闭)、系统事件(比如来电、记事项警告),本文会介绍如何加载应用程序的UIView到 UIWindow以及如何利用UIApplicationDelegate处理系统事件。
代码------------------------------------------------------------------------------------------------------------------------------------------------
UIWindow *window;
代码------------------------------------------------------------------------------------------------------------------------------------------------
// 一、UIWindow是一种特殊的UIView,通常在一个程序中只会有一个UIWindow,但可以手动创建多个UIWindow,同时加到程序里面。UIWindow在程序中主要起到三个作用:
// 1、作为容器,包含app所要显示的所有视图
// 2、传递触摸消息到程序中view和其他对象
// 3、与UIViewController协同工作,方便完成设备方向旋转的支持
// 二、通常我们可以采取两种方法将view添加到UIWindow中:
// 1、addSubview
// 直接将view通过addSubview方式添加到window中,程序负责维护view的生命周期以及刷新,但是并不会为去理会view对应的ViewController,因此采用这种方法将view添加到window以后,我们还要保持view对应的ViewController的有效性,不能过早释放。
// 2、rootViewController
// rootViewController时UIWindow的一个遍历方法,通过设置该属性为要添加view对应的ViewController,UIWindow将会自动将其view添加到当前window中,同时负责ViewController和view的生命周期的维护,防止其过早释放
// 三、WindowLevel
// UIWindow在显示的时候会根据UIWindowLevel进行排序的,即Level高的将排在所有Level比他低的层级的前面。
代码------------------------------------------------------------------------------------------------------------------------------------------------
@property (nonatomic, retain) UIWindow *window;
代码------------------------------------------------------------------------------------------------------------------------------------------------
//@property是Object-C的一个特性,可以让我们轻松实现成员变了的setting和getting方法。具体的语法如下:以成员变量NSString *m_name为例;
//头文件中声明如下:@property NSString *m_name;
//m文件实现:@synthesize m_name;
//这样我们便生成了两个方法,一个get方法:m_name,一个为set方法:setM_name;但对于对象类型,以及权限操作等,@property还是提供了很多参数来进行控制。
//我们可以在@property后面添加参数,使用如下形式:
//@property (.....) NSString *m_name;
//其中支持的参数包括
//1,getter=getterName,setter=setterName,设置setter与getter的方法名,除非你想自己取名,否则一般使用默认的名字即可。以免造成混乱。
//2,readwrite,readonly,设置可供访问级别的限制。
//2,assign,调用setter方法时直接赋值,不进行任何retain操作。
//3,retain,调用setter方法时,先release旧值,然后对赋予的新值执行retain,相当于一次指针的拷贝。
//4,copy,setter方法进行Copy操作,与retain处理流程一样,先release旧值,再Copy出新的对象,retainCount为1。其实是建立一个新的对象。
//5,nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。
//让我们来看retain的实际语法为:
//- (void)setName:(NSString *)newName
//{
//if (name != newName)
//{
//[name release];
//name = [newName retain];
//}
//}
//因此对于一般的基本数据类型,我们使用assign即可,对于对象我们大多数情况下使用retain。对于像NSString*类型的对象可以使用copy。