没有合适的资源?快使用搜索试试~ 我知道了~
首页深入浅出Cocoa教程
深入浅出Cocoa教程
需积分: 10 35 下载量 59 浏览量
更新于2023-03-16
评论 1
收藏 5.62MB PDF 举报
runtime,kvo,底层原理,是一部非常不错的数据,赚点小积分,大家自取
资源详情
资源评论
资源推荐
飘飘白云的《深入浅出 Cocoa 教程》
1 / 163
飘飘白云(罗朝辉):http://blog.csdn.net/kesalin 微博交流:http://weibo.com/kesalin/
深入浅出 Cocoa 教程
作者:罗朝辉
2012/11/29 整理成册
简介
这是本人在学习和使用 Cocoa 开发过程中写过的一些文章,涵盖 runtime,class,
message,KVO,多线程,core data,网络,framework,plugin 等各方面。不仅研
究了应该如何使用这些技术,还深入底层探究这些技术是如何实现的,及其 runtime 分
析。整体上来说还比较成系列,所以整理出来,希望对大家有帮助。
CSDN 移动开发专栏《深入浅出 Cocoa》包含了这个 pdf 中的所有文章,并会持续添加新
的文章,欢迎大家访问该专栏(http://blog.csdn.net/column/details/cocoa.html),查 看
最新情况。
文中错误之处难免,欢迎大家指出,指正。
版权声明
若非特别说明,所有文章均为原创作品。所有原创作品均遵循“署名-非商业用途-保持一致”
创作公用协议。
本人简介
罗朝辉,中文网名:飘飘白云,英文网名:kesalin,从事移动应用开发及游戏开发相关工
作。对移动互联网,游戏领域感兴趣,C/C++/Objective-C 爱好者,也是 3D 图形学爱好者
(虽然并不精通),欢迎大家与我交流,一起成长。
与我交流
Email: kesalin@gmail.com
微博: http://weiblo.com/kesalin
CSDN 博客: http://blog.csdn.com/kesalin
飘飘白云的《深入浅出 Cocoa 教程》
2 / 163
飘飘白云(罗朝辉):http://blog.csdn.net/kesalin 微博交流:http://weibo.com/kesalin/
目录
[深入浅出 Cocoa] 之类与对象 ....................................................................................................... 3
[深入浅出 Cocoa] 之动态创建类 ................................................................................................... 7
[深入浅出 Cocoa] 之消息 ............................................................................................................. 11
[深入浅出 Cocoa] 之消息(二)-详解动态方法决议(Dynamic Method Resolution) ................ 19
序言 ................................................................................................................................. 19
一,向一个对象发送该对象无法处理的消息 ............................................................. 19
二,动态方法决议 ......................................................................................................... 21
三,源码剖析 ................................................................................................................. 23
四,加入消息转发 ......................................................................................................... 26
五,总结 ......................................................................................................................... 30
六,引用 ......................................................................................................................... 30
[深入浅出 Cocoa]详解键值观察(KVO)及其实现机理 ............................................................. 31
一,前言 ......................................................................................................................... 31
二,运用键值观察 ......................................................................................................... 31
三,手动实现键值观察 ................................................................................................. 34
四,自动实现键值观察 ................................................................................................. 35
五,键值观察依赖键 ..................................................................................................... 36
六,键值观察是如何实现的 ......................................................................................... 41
七,总结 ......................................................................................................................... 46
八,引用 ......................................................................................................................... 46
[深入浅出 Cocoa] 之 Method Swizzling ....................................................................................... 47
[深入浅出 Cocoa] 之多线程 NSThread ...................................................................................... 56
[深入浅出 Cocoa] 多线程编程之 block 与 dispatch quene ...................................................... 60
[深入浅出 Cocoa] 之 Bonjour 网络编程 ................................................................................... 70
[深入浅出 Cocoa] 之 Framework ................................................................................................ 80
[深入浅出 Cocoa] 之 Plugin ........................................................................................................ 88
[深入浅出 Cocoa] 之 Core Data(1)- 框架详解 ..................................................................... 98
[深入浅出 Cocoa] 之 Core Data(2)- 代码示例 ................................................................... 105
[深入浅出 Cocoa] 之 Core Data(3)- 使用绑定 ................................................................... 115
[深入浅出 Cocoa] 之 Core Data(4)- 使用绑定 ................................................................... 124
[调试]XCode 下的 iOS 单元测试 ............................................................................................... 132
[调试]XCode 的一些调试技巧 ..................................................................................................... 143
[版本管理]Mac 下配置 Git 服务器........................................................................................... 146
[翻译]苹果 Cocoa 编码规范 ...................................................................................................... 151
飘飘白云的《深入浅出 Cocoa 教程》
3 / 163
飘飘白云(罗朝辉):http://blog.csdn.net/kesalin 微博交流:http://weibo.com/kesalin/
[深入浅出 Cocoa] 之类与对象
罗朝辉(http://blog.csdn.com/kesalin/)
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 的定义:
typedef struct objc_class *Class;
typedef struct objc_object {
Class isa;
} *id;
Class 是一个 objc_class 结构类型的指针;而 id(任意对象) 是一个 objc_object 结构类型的指针,
其第一个成员是一个 objc_class 结构类型的指针。注意这里有一关键的引申解读:内存布局以一个
objc_class 指针为开始的所有东东都可以当做一个 object 来对待! 那 objc_class 又是怎样一个结
构体呢?且看:
struct objc_class
{
struct objc_class* isa;
struct objc_class* super_class;
const char* name;
long version;
long info;
long instance_size;
struct objc_ivar_list* ivars;
struct objc_method_list** methodLists;
struct objc_cache* cache;
struct objc_protocol_list* protocols;
};
objc_class 结构体的各成员介绍如下:
isa:是一个 objc_class 类型的指针,看到这里,想起我前面的引申解读了没?内存布局以一个 objc_class 指
针为开始的所有东东都可以当做一个 object 来对待! 这就是说 objc_class 或者说类其实也可以当做一个
飘飘白云的《深入浅出 Cocoa 教程》
4 / 163
飘飘白云(罗朝辉):http://blog.csdn.net/kesalin 微博交流:http://weibo.com/kesalin/
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 关系图>
飘飘白云的《深入浅出 Cocoa 教程》
5 / 163
飘飘白云(罗朝辉):http://blog.csdn.net/kesalin 微博交流:http://weibo.com/kesalin/
那么 class 与 metaclass 有什么区别呢?
class 是 instance object 的类类型。当我们向实例对象发送消息(实例方法)时,我们在该实例对象的
class 结构的 methodlists 中去查找响应的函数,如果没找到匹配的响应函数则在该 class 的父类中的
methodlists 去查找(查找链为上图的中间那一排)。如下面的代码中,向 str 实例对象发送
lowercaseString 消息,会在 NSString 类结构的 methodlists 中去查找 lowercaseString 的响应
函数。
NSString * str;
[str lowercaseString];
metaclass 是 class object 的类类型。当我们向类对象发送消息(类方法)时,我们在该类对象的
metaclass 结构的 methodlists 中去查找响应的函数,如果没有找到匹配的响应函数则在该
metaclass 的父类中的 methodlists 去查找(查找链为上图的最右边那一排)。如下面的代码中,向
NSString 类对象发送 stringWithString 消息,会在 NSString 的 metaclass 类结构的
methodlists 中去查找 stringWithString 的响应函数。
[NSString stringWithString:@"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;
剩余162页未读,继续阅读
小强_xiaowenqiang
- 粉丝: 1
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 27页智慧街道信息化建设综合解决方案.pptx
- 计算机二级Ms-Office选择题汇总.doc
- 单链表的插入和删除实验报告 (2).docx
- 单链表的插入和删除实验报告.pdf
- 物联网智能终端项目设备管理方案.pdf
- 如何打造品牌的模式.doc
- 样式控制与页面布局.pdf
- 武汉理工Java实验报告(二).docx
- 2021线上新品消费趋势报告.pdf
- 第3章 Matlab中的矩阵及其运算.docx
- 基于Web的人力资源管理系统的必要性和可行性.doc
- 基于一阶倒立摆的matlab仿真实验.doc
- 速运公司物流管理模式研究教材
- 大数据与管理.pptx
- 单片机课程设计之步进电机.doc
- 大数据与数据挖掘.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0