NsObject介绍:
NSObject协议组对所有的Object-C下的objects都生效。
如果objects遵从该协议,就会被看作是first-class objects(一级类)。
另外,遵从该协议的objects的retain,release,autorelease等方法也服从objects的管理和在Foundation中定义的释放方法。一些容器中的对象也可以管理这些objects,比如
说NSArray 和NSDictionary定义的对象。
Cocoa的根类也遵循该协议,所以所有继承NSObjects的objects都有遵循该协议的特性。
NSObjects采用的协议:
NSObject
- autorelease
- class
- conformsToProtocol:
- description
- hash
- isEqual:
- isKindOfClass:
- isMemberOfClass:
- isProxy
- performSelector:
- performSelector:withObject:
- performSelector:withObject:withObject:
- release
- respondsToSelector:
- retain
- retainCount
- self
- superclass
- zone
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的形式输出,译者注)
参见 “Introspection”(页87)以获取更多的信息
■ Object encoding and decoding(对象的编码和解码).接下来的方法将与对象的编码和解码方式有关 (作为一个归档处理的一部分):
❏encodeWithCoder: 和 initWithCoder:方法,NSCoding协议中仅有的组成成员。第一个允许对象编译它的实例变量,第二个允许一个对象初始化它自身的解码实例变量。
❏NSObject类声明了一些与对象编码相关的其它方法,有:classForCoder,replacementObjectForCoder:,和awakeAfterUsingCoder:。
参阅Archives and Serializations Programming Guide for Cocoa来获取更多的信息。
■ Message forwarding(消息转发). forwardInvocation:允许一个对象把消息转发给另一个对象。
■ Message dispatch(消息配送). 一个以performSelector...为开头的方法允许你配送消息(message)直到指定的延迟后,并且可以从二级线程((synchronously or asynchronously)同步或者不同步地)配送消息到主线程。
NSObject拥有许多其它的方法,比如版本和传递的类方法(class methods for versioning and posing)(之后将为你展示如何将一个类本身编译为另一个类)。它既包括了方法让你访问编译器数据结构的类,比如selector方法和函数指针形式的方法实现。
NSObject构架
协议与类
· 包含协议:NSObject、NSCopying、NSMutableCopying、NSCoding
· NSObject类默认只实现了NSObject协议,如果用户需要其他协议功能则需要自己实现该协议。
初始化、析构
load
+(void) load
作用:类加载到运行时环境时发送该消息
说明:
· 在类没有实例化对象的时候,该函数就已经被调用了
· 即使一个类没有被程序使用,它也会加载到运行时环境
initialize
+ (void)initialize;
作用:在类第一次使用的时候发送该消息
说明:父类会被先掉,所以子类initialize函数不需要发送父类initialize消息。
alloc
+ (id)alloc;
作用:返回一个已经分配好内存的实例
init
- (id)init;
作用:对已经分配了内存的实例进行初始化(相当于构造函数),不一定要默认的构造函数,也可以自己写(一般就是加一些参数)。
常见形式:
- (id)init{ self = [super init]; //........初始化............... return self; } |
new
+ (id)new;
作用:同时调用了alloc和init。
dealloc
- (void)dealloc;
作用:析构函数
拷贝
copyWithZone
+ (id)copyWithZone:(NSZone *)zone;
作用:拷贝函数。类中重载改函数,copy的时候会调用该函数
说明:
· 该函数是NSCopy协议的函数
· c++的拷贝构造函数是把外部的值拷进来,旨在构造。而copyWithZone:函数将自己拷贝一份送给外面,旨在送出拷贝。
sample:
MyClass:NSObject | MyClass2:MyClass |
-(id)copyWithZone:(NSZone *)zone { MyClass *copy = [MyClass new]; copy->test = self->test; return copy; } | -(id)copyWithZone:(NSZone *)zone { MyClass2* copy = [super copyWithZone:zone]; copy->test2 = self->test2; return copy; } |
copy
- (id)copy;
作用:发送接收者定义的copyWithZone:nil消息;
mutableCopyWithZone
+ (id)mutableCopyWithZone:(NSZone *)zone;
作用:和copyWithZone一样起拷贝作用;
说明:
· 与copyWithZone不同的是它用于返回一个可变类型(如果你希望从一个[不可变类型或可变类型]变成[可变类型],则重载改函数)
· 改函数NSMutableCopying协议的函数
mutableCopy
- (id)mutableCopy;
作用:调用mutableCopyWithZone:nil
运行时状态
说明:运行时状态可以在运行时获得对象的层次关系,确定对象是否实现某写方法,测试协议等。在写框架的时候很有用。
class
- (Class)class;
+ (Class)class;
作用:返回当前对象所属类
superclass
- (Class)superclass;
+ (Class)superclass;
作用:返回当前对象的父类
isKindOfClass
- (BOOL)isKindOfClass:(Class)aClass;
作用:判定receiver是否为aClass或其子类的实例
isMemberOfClass
- (BOOL)isMemberOfClass:(Class)aClass;
作用:判定receiver是否为aClass的实例
isSubclassOfClass
+ (BOOL)isSubclassOfClass:(Class)aClass
作用:判定是否为aClass的子类
说明:只有类方法
respondsToSelector
- (BOOL)respondsToSelector:(SEL)aSelector;
作用:判断receiver是否响应某消息
注意: 不包括类方法
instancesRespondToSelector
+ (BOOL)instancesRespondToSelector:(SEL)aSelector;
作用:判断类的对象是否响应某消息
注意:不包括类方法
conformsToProtocol
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
作用:判断是否实现某协议
说明:参数可以用@protocal(协议名称)制作
description
- (NSString*)description;
作用:返回一串对象的描述,描述中包含了对象的详细信息(方便用于调试)
比较
要重载比较最好先重载-(NSComparisonResult)compare:(id)object
hash
- (NSUInteger)hash;
作用:返回一串数,代表对象的hash值
isEqual
- (BOOL)isEqual:(id)object;
作用:比较两个对象是否相同
说明:默认是用地址进行比较,且hash值一定要相同
对象编解码
§ 如果对象需要归档(保存到文件中)时,我们需要定义编解码函数,告诉程序对象的哪些属性需要按什么顺序保存;哪些数据是要读取的,读取后存在哪些变量中。
§ 通常需要配合NSArchiver和NSUnarchiver使用
encodeWithCoder
- (void)encodeWithCoder:(NSCoder *)aCoder;
作用:定义对象的编码,即对象的哪些属性是需要保存下来的
initWithCoder
- (id)initWithCoder:(NSCoder *)aDecoder;
作用:定义对象的解码,即取出的每一条属性要存放到哪些变量中,进而初始化对象
注意:对象的属性要retain下来
对象内存管理
- (id)retain; //引用次数+1
- (onewayvoid)release; //引用次数-1
- (id)autorelease; //引用次数-1,且向autorelase pool发送消息
- (NSUInteger)retainCount; //返回当前引用次数
说明:详情见《内存管理》
其他
§ 消息的转发。forwardInvocation:和相关的方法允许一个对象将消息转发给另一个对象。
§ 消息的派发。以performSelector...开头的一组方法使您可以在指定的延迟后派发消息,以及将消息从辅助线程派发(同步或异步)到主线程。
NSObject还有几个其它的方法,包括一些处理版本和姿态(后者使一个类在运行时将自己表示为另一个类)的类方法,以及一些访问运行时数据结构的方法,比如方法选择器和指向方法实现的函数指针。
原文出处:http://blog.csdn.net/illusionrain/article/details/6834024