`
luliangok
  • 浏览: 816410 次
文章分类
社区版块
存档分类
最新评论

深入浅出Cocoa之类与对象

 
阅读更多
深入浅出Cocoa之类与对象
CC许可,转载请注明出处

最近打算写一些ObjC中比较底层的东西,尤其是 runtime 相关的。苹果已经将 ObjC runtime 代码开源了,我们可以从:http://opensource.apple.com/source/objc4/objc4-493.9/runtime/浏览源代码,或点此下载源代码。

从哪里入手呢?那当然是最基本的类与对象。与C++相比,ObjC中的类与对象结构要简洁与一致得多(参考《深度探索C++对象模型》,你就知道C++中类与对象结构的复杂)。本文将详细讲解ObjC中类与对象的结构,下回将讲如何在 runtime 时操作类。


我们可以在/usr/include/objc/objc.h 和 runtime.h 中找到对 class 与 object 的定义:

typedefstructobjc_class*Class;
typedefstructobjc_object{
Classisa;
}*id;

Class 是一个 objc_class 结构类型的指针;而 id(任意对象) 是一个 objc_object 结构类型的指针,其第一个成员是一个 objc_class 结构类型的指针。注意这里有一关键的引申解读:内存布局以一个 objc_class 指针为开始的所有东东都可以当做一个 object 来对待!那 objc_class 又是怎样一个结构体呢?且看:

structobjc_class
{
structobjc_class*isa;
structobjc_class*super_class;
constchar*name;
longversion;
longinfo;
longinstance_size;
structobjc_ivar_list*ivars;
structobjc_method_list**methodLists;
structobjc_cache*cache;
structobjc_protocol_list*protocols;
};

objc_class 结构体的各成员介绍如下:

isa:是一个 objc_class 类型的指针,看到这里,想起我前面的引申解读了没?内存布局以一个 objc_class 指针为开始的所有东东都可以当做一个 object 来对待!这就是说 objc_class 或者说类其实也可以当做一个 objc_object 对象来对待!对象是对象,类也是对象,是不是有点混淆?别急,ObjC发明(or 重用)了一个术语来区分这两种不同的对象:类对象(class object)与实例对象(instance object)。OK,名称混淆的问题解决,下面我将使用这两个术语来区分不同的对象,而使用“对象”这一术语来泛指所有的对象。ObjC还对类对象与实例对象中的 isa 所指向的类结构作了不同的命名:类对象中的 isa 指向类结构被称作 metaclass,metaclass 存储类的static类成员变量与static类成员方法(+开头的方法);实例对象中的 isa 指向类结构称作 class(普通的),class 结构存储类的普通成员变量与普通成员方法(-开头的方法)。

super_class:一看就明白,指向该类的父类呗!如果该类已经是最顶层的根类(如 NSObject 或 NSProxy),那么 super_class 就为 NULL。

好,先中断一下其他类结构成员的介绍,让我们厘清一下在继承层次中,子类,父类,根类(这些都是普通 class)以及其对应的 metaclass 的 isa 与 super_class 之间关系:
规则一:类的实例对象的 isa 指向该类;该类的 isa 指向该类的 metaclass;
规则二:类的 super_class 指向其父类,如果该类为根类则值为 NULL;
规则三:metaclass 的 isa 指向根 metaclass,如果该 metaclass 是根 metaclass 则指向自身;
规则四:metaclass 的super_class指向父 metaclass,如果该 metaclass 是根 metaclass 则指向该metaclass 对应的类;

好吧,文字总是那么乏力,有图有真相!

<instance object,class,metaclass 的 isa 与 super_class 关系图>

那么 class 与 metaclass 有什么区别呢?

class 是 instance object 的类类型。当我们向实例对象发送消息(实例方法)时,我们在该实例对象的 class 结构的 methodlists 中去查找响应的函数,如果没找到匹配的响应函数则在该 class 的父类中的 methodlists 去查找(查找链为上图的中间那一排)。如下面的代码中,向str 实例对象发送 lowercaseString 消息,会在 NSString 类结构的 methodlists 中去查找 lowercaseString 的响应函数。

NSString*str;
[strlowercaseString];

metaclass 是 class object 的类类型。当我们向类对象发送消息(类方法)时,我们在该类对象的 metaclass 结构的 methodlists 中去查找响应的函数,如果没有找到匹配的响应函数则在该 metaclass 的父类中的 methodlists 去查找(查找链为上图的最右边那一排)。如下面的代码中,向 NSString 类对象发送 stringWithString 消息,会在 NSString 的 metaclass 类结构的 methodlists 中去查找 stringWithString 的响应函数。

[NSStringstringWithString:@"str"];

好,至此我们明白了类的结构层次,让我们接着看类结构中的其他成员。

name:一个 C 字符串,指示类的名称。我们可以在运行期,通过这个名称查找到该类(通过:id objc_getClass(const char *aClassName))或该类的 metaclass(id objc_getMetaClass(const char *aClassName));

version:类的版本信息,默认初始化为 0。我们可以在运行期对其进行修改(class_setVersion)或获取(class_getVersion)。

info:供运行期使用的一些位标识。有如下一些位掩码:
CLS_CLASS (0x1L) 表示该类为普通 class ,其中包含实例方法和变量;
CLS_META (0x2L) 表示该类为 metaclass,其中包含类方法;
CLS_INITIALIZED (0x4L) 表示该类已经被运行期初始化了,这个标识位只被 objc_addClass 所设置;
CLS_POSING (0x8L) 表示该类被 pose 成其他的类;(poseclass 在ObjC 2.0中被废弃了);
CLS_MAPPED(0x10L) 为ObjC运行期所使用
CLS_FLUSH_CACHE (0x20L) 为ObjC运行期所使用
CLS_GROW_CACHE (0x40L) 为ObjC运行期所使用
CLS_NEED_BIND (0x80L) 为ObjC运行期所使用
CLS_METHOD_ARRAY (0x100L) 该标志位指示 methodlists 是指向一个 objc_method_list 还是一个包含 objc_method_list 指针的数组;

instance_size:该类的实例变量大小(包括从父类继承下来的实例变量);


ivars:指向 objc_ivar_list 的指针,存储每个实例变量的内存地址,如果该类没有任何实例变量则为 NULL;

methodLists:与 info 的一些标志位有关,CLS_METHOD_ARRAY 标识位决定其指向的东西(是指向单个 objc_method_list还是一个 objc_method_list 指针数组),如果 info 设置了 CLS_CLASS 则 objc_method_list 存储实例方法,如果设置的是 CLS_META 则存储类方法;

cache:指向 objc_cache 的指针,用来缓存最近使用的方法,以提高效率;

protocols:指向 objc_protocol_list 的指针,存储该类声明要遵守的正式协议。

总结
ObjC 为每个类的定义生成两个 objc_class ,一个即普通的 class,另一个即 metaclass。我们可以在运行期创建这两个 objc_class 数据结构,然后使用 objc_addClass 动态地创建新的类定义。这个够动态够强大的吧?下回讲演示如何在运行期动态创建新类。


分享到:
评论

相关推荐

    深入浅出Cocoa教程

    - [深入浅出Cocoa]之类与对象 - [深入浅出Cocoa]之动态创建类 - [深入浅出Cocoa]之消息 - [深入浅出Cocoa]之消息(二)-详解动态方法决议 - [深入浅出Cocoa]详解键值观察(KVO)及其实现机理 - [深入浅出Cocoa]之...

    Objective-C语法深入浅出-适合作为学习IOS开发的入门材料

    ### Objective-C语法深入浅出-适合作为学习iOS开发的入门材料 #### 一、Objective-C简介 **Objective-C**是一种面向对象的编程语言,它建立在C语言的基础之上,并且是C语言的一个超集。这意味着您可以在Objective-...

    深入浅出iphone编程 (headfirst iphone development)1-10 chapter

    《深入浅出iPhone编程》是Head First系列中的一本经典教程,专为初学者设计,旨在帮助读者轻松掌握iPhone应用开发。Head First系列以其独特的视觉风格和易理解的教学方法著称,通过丰富的图像、幽默的语言和实用的...

    cocoa 设计模式

    #### 一、设计模式与Cocoa框架 设计模式是软件工程领域的一个重要概念,它提供了一套解决常见问题的方案。在Cocoa开发中,设计模式的应用能够极大地提升代码的可读性、可维护性和扩展性。本书《Cocoa设计模式》由...

    Objective-C程序设计.rar

    《Objective-C程序设计》这本书很可能深入浅出地介绍了这种语言的基础和高级特性。从基础部分,我们可以期待学习到Objective-C的语法,包括类、对象、方法、属性等基本概念。Objective-C中的类是对象的蓝图,定义了...

    Objective-C.2.0程序设计

    《Objective-C.2.0程序设计》是一本深入浅出介绍Objective-C编程语言的经典教材,尤其适合初学者作为入门指南。Objective-C是一种面向对象的编程语言,由Stepstone公司在1980年代开发,后来被苹果公司收购并进一步...

    iphone 开发Objective-C

    ### Objective-C基础教程:iPhone开发必备 ...对于希望从事iOS开发的专业人士来说,《Objective-C基础教程》是一本不可多得的好书,它不仅深入浅出地讲解了Objective-C的各种特性,还通过丰富的示例帮助读者快速上手。

    object-c基础教程

    本教程将深入浅出地介绍Object-C的基础知识,帮助初学者快速入门。 ### 一、Object-C简介 Object-C是在C语言基础上扩展的,增加了面向对象的特性,如类、继承、消息传递等。它的语法与Smalltalk非常相似,但同时也...

    Objective-C_2.0程序设计

    4. **对象复制与归档**:支持对象的深复制和浅复制,以及将对象序列化为持久存储格式的功能。 #### 四、Cocoa和iPhone SDK 1. **Cocoa**:Cocoa是Mac OS X的应用程序框架,包含了一系列API,用于构建桌面应用程序...

    Objective-C基础教程

    本教程将深入浅出地介绍Objective-C的基础知识,帮助初学者快速掌握这一强大的工具。 1. **Objective-C简介** Objective-C起源于1980年代,由Stepanov和McCarthy在C语言基础上扩展而成。它的主要特点包括消息传递...

    iphone开发入门

    这本书深入浅出地讲解了使用Cocoa Touch框架和Objective-C语言进行iPhone(以及后来的iOS设备)应用开发的基本概念和实践技巧。 在iOS开发中,Objective-C是主要的编程语言,它是一种面向对象的语言,基于C语言,并...

    BecomeAnXcoder

    《BecomeAnXcoder》是一本专为初学者设计的iPhone和Mac OS开发教程,它以其通俗易懂的语言和深入浅出的讲解,帮助读者快速掌握Objective-C编程语言以及图形和非图形程序设计的基础知识。本教程是那些希望踏入苹果...

    IOS7 Programming Fundamentals

    全书围绕Objective-C语言、Xcode集成开发环境以及Cocoa框架展开,为读者提供了深入浅出的学习材料。 #### 二、Objective-C基础 Objective-C是一种面向对象的编程语言,是iOS开发的主要语言之一。本书第一章重点...

    macOS Programming for Absolute Beginners.epub.zip

    这本教程不仅涵盖了macOS平台的特性和环境,还深入浅出地讲解了编程语言、开发工具以及如何构建应用程序的基本流程。 在macOS系统中编程首先需要了解其核心组件,包括达尔文操作系统(Darwin)、图形用户界面...

    Objective-C Programming_ The Big Nerd Ranch Guide, 2_

    本书深入浅出地介绍了Objective-C的关键概念,包括面向对象编程(OOP)原理、内存管理、消息传递、类和对象的创建、协议和代理等。通过阅读《Objective-C Programming_ The Big Nerd Ranch Guide, 2_e》,读者可以...

Global site tag (gtag.js) - Google Analytics