Jason Lee @ 杭州
博客:http://blog.csdn.net/jasonblog
微博:http://weibo.com/jasonmblog
[Outline]
1. id和Class
2. 动态地操作类
3. 实例化
[1. id和Class] --------------------------------------------------
在Objective-C中有一个特别的数据类型作为对象标识符:id,可以指向任何类型的对象。
通过 “可以指向任何类型的对象” 这一描述,猜想id实际上是指向Objective-C对象系统中的基类(继承体系中的祖先结构)的指针,在运行时是指向对象内存布局的基类部分。
第一眼看到id数据类型,我联想到了Python中的PyObject结构:
该数据类型也是Python对象系统中的祖先类型,不过与id相对应的应该是PyObject *类型。
id数据类型是一个指向struct objc_object结构的指针:
更确切地说,id是指向Class类型的指针,而Class又是指向struct objc_class结构的指针:
至此,可以看到Objective-C对象系统的基石:struct objc_class结构:
[2.动态地操作类] --------------------------------------------------
由上知道了类也是一种对象,那么类对象也有一种类型,这种类型就是类的metaclass,因此类方法其实就是metaclass的成员方法,类和metaclass是配套出现的。
那么metaclass的isa指针和super_class指针怎么指向的呢?
如果metaclass对应基类,那么它的isa指向自身、super_class指针指向对应的类(基类);如果不是则isa指针指向基类的metaclass、super_class指针指向父类的metaclass。
基类的isa指针为nil。
这不禁让我又想起了Python中类似的设计思想,比如整型数字2的类型是PyIntObject,而PyIntObject类的类型是PyTypeObject,PyTypeObject的类型是PyTypeObject。最终止于此。
同样地,Python中也有metaclass的存在。
知道了类的表示结构,我们可以动态地对类进行操作,加深理解。
[3. 实例化] --------------------------------------------------
要实例化出一个对象,需要根据类的定义来进行。类的定义包括类名称、数据和操作数据的方法。
编译过程,类的信息会被记录下来,供runtime system使用,同时编译器会为每个类创建唯一的一个对象来表示它:class object。如果从功能上说,class object也是factory object,它能够执行类方法,负责创建实例。
从这个角度来看,我在思考class object是否就是metaclass,但是不能确认。
Apple官方文档TOCPL中Class Objects一章有这么一句,“a class object keeps the prototype of a class instance”,但metaclass并不能作为实例原型。
于是我认为class object是运行时class和metaclass结合起来的受限表现,能够访问编译器捕捉下来的类信息,没有成员变量,不能调用成员方法,但是可以执行类方法。
从源码层次来看,class object是由类名来表示,比如下述代码中:
NSString代表着class object。
首先,class object会被runtime system发送initialize消息进行初始化,让其做好运行时的准备,比如初始化静态变量。
之后,可以调用class object的方法(类方法)alloc来为新的实例对象分配内存空间,将其所有变量初始化为0,isa指针指向所属类。
最后再调用init函数进行必要的初始化。
写到这里的时候,突然要变更办公位置,思路被打断了,就先写到这里。
最后,留一个在SO上面看到的问题,我也疑惑,只能有几分猜测:http://stackoverflow.com/questions/8847146/whats-is-methodlists-attribute-of-the-structure-objc-class-for
分享到:
相关推荐
Swift-iOS常用动画Demo小结 在iOS应用开发中,动画是提升用户体验、增强界面交互性的重要手段。Swift作为苹果的官方编程语言,提供了丰富的动画支持。本篇将围绕"Swift-iOS常用动画Demo小总结"展开,详细介绍如何在...
总之,WKWebView是iOS开发中加载网页内容的重要组件,它提供了高性能、稳定性和良好的API,便于开发者集成JavaScript交互和HTML5特性。通过熟练掌握WKWebView的使用,开发者可以构建出更加流畅、功能丰富的混合型...
- **Xcode与iOS SDK**:Xcode是Apple官方提供的集成开发环境,其中包含了用于iOS开发的各种工具、编译器和框架。Xcode可以从Mac App Store免费下载。 ##### 安装Xcode 1. **访问App Store**:打开Mac上的App Store...
小结 在本章节中,我们学习了如何使用NSUserDefaults来记录相关信息,判断用户是否是首次打开应用。我们还了解了基本数据类型和对象的区别,并学习了如何将基本数据类型的值转换成NSNumber对象。这些知识点对于iOS...
#### 本章小结 Titanium Mobile为开发者提供了一种高效的跨平台移动应用开发方式。通过使用JavaScript,开发者能够快速构建功能丰富的应用程序,并且能够在iOS和Android两个主要平台上运行。虽然存在一些局限性,但...
在iOS开发中,每个应用程序都有其独特的沙盒环境,这意味着每个应用只能访问其内部的数据,无法直接访问其他应用的文件。对于文件目录的访问和管理,开发者需要了解苹果的推荐做法,以确保数据的安全和正确存储。...
iOS应用逆向工程(第2版) 第一部分 概 念 篇 第1章 iOS逆向工程简介 3 1.1 iOS逆向工程的要求 3 1.2 iOS应用逆向工程的作用 4 1.2.1 安全相关的iOS逆向工程 5 1.2.2 开发相关的iOS逆向工程 6 ...10.6 小结 373
### iOS应用教程入门知识点 #### 一、介绍与设置 - **目的与适用范围**: - 本教程旨在引导初学者快速上手iOS应用程序开发,适用于希望...这将为新手开发者提供一条清晰的学习路径,帮助他们在iOS开发领域取得成功。
#### 三、小结 本文介绍了C++中文件操作的基础知识,包括文件流的种类、文件的打开与关闭方式、基本读写操作以及二进制文件的处理方法。掌握这些基础知识对于开发基于文件处理的应用程序至关重要。
作者Matt Neuburg凭借其丰富的经验和深入浅出的讲解方式,为读者提供了一个系统学习iOS开发的良好起点。对于希望进入iOS开发领域的初学者来说,这本书是不可多得的宝贵资源。此外,对于已经具备一定经验的开发者而言...
在iOS开发中,我们通常使用两种主要的XML解析方法:SAX(Simple API for XML)和DOM(Document Object Model)。 1. **SAX解析**: SAX是一种事件驱动的解析方式,它不会一次性加载整个XML文档到内存中,而是逐行...
- **小结**:总结这一阶段学到的关键概念和技能,为接下来的学习做好准备。 #### 构建应用程序结构 - **应用程序开发过程**: - **定义概念**:在开始编码之前,明确应用程序的目标和功能是非常重要的。 - **...
#### 小结 本书《iOS 7 Programming Cookbook》是一本实用性强、覆盖广泛iOS开发知识点的指南。通过本书的学习,读者不仅可以了解iOS 7平台上各种常用控件的使用方法,还能学会如何通过这些控件构建出美观且功能丰富...
【iOS NSNotificationCenter通知中心使用小结】 iOS中的NSNotification中心是一个重要的通信机制,它允许对象间进行松耦合的消息传递。NSNotification与Delegate都是iOS中常见的消息传递方式,它们各有特点和适用...
### 小结 通过对`ifstream`及其相关类的理解和使用,我们可以更有效地处理文件的输入输出操作。这些操作不仅限于简单的读写,还可以包括文件打开模式的选择、错误处理等高级功能。掌握这些技术对于开发需要处理大量...
在iOS开发中,UIView是构建用户界面的基本组件。它提供了屏幕上的可视元素,如按钮、文本字段等。本文将深入探讨iOS UIView的一些常见属性和方法,帮助开发者更好地理解和使用它们。 1. **初始化方法**: - `(id)...
在iOS开发过程中,Xcode是不可或缺的开发工具,它提供了丰富的功能和快捷方式来提高开发效率。以下是对标题和描述中所述Xcode使用技巧的详细解释: 1. **快捷键的使用**: - `shift + cmd + n`:新建项目或文件。 ...
在iOS开发中,UILabel是用于显示单行或多行文本的常用控件。本文将深入探讨在Objective-C中使用UILabel设置字体的相关技巧。 首先,我们从初始化UILabel开始。创建一个UILabel对象,通常通过调用`initWithFrame:`...