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
分享到:
相关推荐
在iOS和Objective-C的世界里,`NSObject`是所有对象的基础,它是Cocoa Touch和Cocoa框架的核心部分。这个压缩包“NSObject源码.zip”显然包含了`NSObject`类的源代码,这对于我们深入理解Objective-C的对象模型和...
### NSObject扩展:深入理解与应用 在Objective-C中,`NSObject`是所有类的基类,它提供了许多基本的功能和属性。对`NSObject`进行扩展(Category)是一种常见的编程技巧,用于向现有类添加额外的功能,而无需修改...
在Objective-C中,`NSObject`是所有对象的基类,它提供了一系列基本的功能,包括响应消息的能力。在处理未知或未实现的消息时,`NSObject`提供了两个关键的方法:`methodSignatureForSelector:` 和 `...
在PYTheme中,类别被用来扩展`NSObject`,使得所有的Swift对象都可以方便地与主题系统进行交互。 PYTheme的核心思想是将主题定义为一组颜色、图片等资源的集合,通过一个全局的主题管理器来控制这些资源的切换。当...
NSObject脑图
利用runtime对NSObject进行分类扩展,解决字典转Model的问题 原理:http://www.jianshu.com/p/71454166c397 github:https://github.com/cccgoodboy/CCModel 喜欢请给个star 谢谢!
iOS NSObject对象的本质、内存分配、ISA指针及superclass底层源码分析 iOS NSObject对象是iOS开发中最基本也是最重要的对象之一,我们在使用它时往往只是停留在会用的阶段,却没有深入了解过它的本质。今天我们就来...
### 探索 `NSObject` 的协议精髓:Objective-C 中的基础方法解析 Objective-C 是一种面向对象的编程语言,建立在 C 语言的基础上,增加了面向对象的特性。它最初由 Brad Cox 和 Tom Love 设计,后来被苹果公司采纳...
本文将基于"InterView-NSObject的内存分析"这一主题,结合提供的压缩包文件,探讨OC对象的本质,特别是NSObject的内存占用情况。 首先,我们需要了解OC中的对象是由内存中的数据结构表示的。每个OC对象都始于一个`...
`NSObject`树是Objective-C或Swift编程中的一种概念,它描述了对象之间的层次关系。在这个上下文中,`NSObject`树主要指的是由`UIResponder`类及其子类构成的层级结构,这些子类构成了iOS应用的基础视图和控制器体系...
Motis 使用 Cocoa 的 KVC 实现了智能的 JSON 到 NSObject 对象的映射。 示例代码: // --- User.h --- // @interface User : NSObject @property (nonatomic, strong) NSString *name; @property ...
NSObject + Rx 如果使用 ,则可能多次遇到以下代码。 class MyObject : Whatever {let disposeBag = DisposeBag ()...} 实际上,您并不是唯一的一个。 它已经被键入很多次了。 不用向每个对象添加新属性,而是使用此...
"NSObject+RunTimeUtilit"这个项目显然就是针对Runtime特性的一个实用工具包,通过扩展NSObject类来提供便捷的方法来操作私有属性。 首先,我们要理解什么是Objective-C的Runtime。Objective-C的运行时系统是其动态...
在Objective-C编程中,`NSObject`是所有类的基类,它定义了基本的对象行为,如消息传递、内存管理等。而`description`方法是`NSObject`中的一个关键方法,用于返回一个对象的字符串表示,通常用于调试和日志记录。`...
协议中<NSobject>是什么意思? 子类继承了父类,子类会遵守父类遵守的协议吗? 会遵守NSObject协议,但是只在头文件中声明,编译器是不会自动生成实例变量的。需要自己处理getter和setter 方法 NS/CF/CG/CA/UI这些...
//获得NSObject 类的实例对象的大小//获取obj对象指针获取的大小输出结果分别是8 和 16系统分配了16个字节给NSObject对象(通过mallo
MBJSONModel, 快速和轻量的JSON → NSObject翻译 #MBJSONModel快速和轻量的JSON → NSObject翻译。示例@interface User : MBJSONModel@property (nonatomic, copy) NSString *nam
REKit, 一个NSObject扩展集合,它带来了潜在的块能力 REKit*Branch "专长/classmethod"正在建设中,但更稳定。REKit [rikít] 是 NSObject 扩展的集合。 目前它提供了 2个功能:REResponder: 提供在实例级添加/重写...
NSObject-FromClassName 快速扩展,可从其类名快速获取NSObject extension NSObject { class func fromClassName ( className : String ) -> NSObject { let className = NSBundle. mainBundle (). infoDictionary !...
NSObject-序列化用法要运行示例项目, pod install克隆 repo,然后从 Example 目录运行pod install 。要求安装NSObject-Serialize 可通过。 要安装它,只需将以下行添加到您的 Podfile 中: pod "NSObject-Serialize...