IOS开发教程Class详解
更新时间:2023-05-12 01:03:01 阅读量: 实用文档 文档下载
IOS开发教程Class详解
我们都知道,iOS的开发语言objective-c,它只是一个对象语言,其实它就是C+,有个公式可以很好地诠释那就是OC = C + Runtime; 接下来我们就好好讲讲在Runtime下的objc-class。准备资料,objc4-646/runtime。
一:Class定义
1.1 说明一下objc-api.h里的OBJC_ISA_AVAILABILITY:
/*介绍一下__attribute__((deprecated))的作用,__attribute是给函数、变量、类做属性说明的关键字,deprecated是弃用原先的进行兼容
若是__OBJC2__,原先的类,编译器发出警告*/ 1. #if !defined(OBJC_ISA_AVAILABILITY)
2. # if __OBJC2__
3. # define OBJC_ISA_AVAILABILITY __attribute__((deprecated))
4. # else
5. # define OBJC_ISA_AVAILABILITY /* still available */
6. # endif
7. #endif
1. typedef struct objc_method *Method;
2. typedef struct objc_ivar *Ivar;
3. typedef struct objc_category *Category;
4. typedef struct objc_property *objc_property_t;
1.2 接下来就是runtime.h里的Class的定义:
1. struct objc_class {
2. Class isa OBJC_ISA_AVAILABILITY;//每个Class都有一个isa指针
3.
IOS开发教程Class详解
4. #if !__OBJC2__
5. Class super_class OBJC2_UNAVAILABLE;//父类
6. const char *name OBJC2_UNAVAILABLE;//类名
7. long version OBJC2_UNAVAILABLE;//类版本
8. long info OBJC2_UNAVAILABLE;//!*!供运行
期使用的一些位标识。如:CLS_CLASS (0x1L)表示该类为普通class;
CLS_META(0x2L)表示该类为metaclass等(runtime.h中有详细列出)
9. long instance_size OBJC2_UNAVAILABLE;//实例
大小
10. struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;//存储
每个实例变量的内存地址
11. struct objc_method_list
**methodLists OBJC2_UNAVAILABLE;//!*!根据info的信息确定是
类还是实例,运行什么函数方法等
12. struct objc_cache *cache OBJC2_UNAVAILABLE;//缓
存
13. struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;//
协议
14. #endif
15.
16. } OBJC2_UNAVAILABLE;
二:class初始化
Runtime的行为之一就是initialize。在程序运行过程中,它会在你程序中每个类调用一次initialize。这个调用的时间发生在你的类接收到消息之前,但是在它的超类接收到initialize之后。
1. //在苹果的官方Runtime中有个objc-initialize.m文件,进行解读
2. typedef struct _objc_initializing_classes {
3. int classesAllocated;//类是否分配存在
4. Class *metaclasses;//类的父类,如果没有父类那就是自身
IOS开发教程Class详解
5. } _objc_initializing_classes;//初始化一个对象_objc_initializing_classes 6.
7. //将所有的类存储在静态链表中,以待接下来的接收和发送消息
8. static _objc_initializing_classes *_fetchInitializingClassList(BOOL create)
9. {
10. _objc_pthread_data *data;
11. //list为类链表
12. _objc_initializing_classes *list;
13. Class *classes;
14.
15. data = _objc_fetch_pthread_data(create);
16. if (data == nil) return nil;
17.
18. //链表增加类节点
19. list = data->initializingClasses;
20. if (list == nil) {
21. if (!create) {
22. return nil;
23. } else {
24. list = (_objc_initializing_classes *)
25. _calloc_internal(1, sizeof(_objc_initializing_classes));
26. data->initializingClasses = list;
27. }
28. }
29. //将创建的classes接在metaclasses后
30. classes = list->metaclasses;
31. if (classes == nil) {
32. // If _objc_initializing_classes exists, allocate metaclass array,
33. // even if create == NO.
34. // Allow 4 simultaneous class inits on this thread before realloc.
35. list->classesAllocated = 4;
36. classes = (Class *)
IOS开发教程Class详解
37. _calloc_internal(list->classesAllocated, sizeof(Class));
38. list->metaclasses = classes;
39. }
40. return list;
41. }
三.runtime下Class的各项重要操作 1. 3.1 add*(增加)
2. 3.1.1 static IMP addMethod(Class cls, SEL name, IMP imp, const char
*types, BOOL replace);//增加方法
3. 3.1.2 BOOL class_addMethod(Class cls, SEL name, IMP imp, const
char *types);//增加类方法
4. 3.1.3 BOOL class_addIvar(Class cls, const char *name, size_t
size,uint8_t alignment, const char *type);//增加实例变量
5. 3.1.4 static BOOL _class_addProperty(Class cls, const char
*name,const objc_property_attribute_t *attrs, unsigned int count,BOOL replace);//增加属性
6. 3.2 replace*(修改)
7. 3.2.1 IMP class_replaceMethod(Class cls, SEL name, IMP imp, const
char *types); //修改方法
8. 3.2.2 void class_replaceProperty(Class cls, const char *name,const
objc_property_attribute_t *attrs, unsigned int n);//修改属性
9. 3.3 get*(获取)
10. 3.3.1 static Class getClass(const char *name);//获取类
11. 3.3.2 static ivar_t *getIvar(Class cls, const char *name);//获取类变量
(static相当于“+“)
12. 3.3.3 Method class_getInstanceMethod(Class cls, SEL sel);//获取实例方
法
13. 3.3.4 static Method _class_getMethod(Class cls, SEL sel);;//获取类方法
14. 3.3.5 static Protocol *getProtocol(const char *name);//增加协议
IOS开发教程Class详解
15. 3.4 set*(设置)
16. 3.4.1 objc_class::setInitialized();//set的initialized初始化
17. 3.4.2 static Class setSuperclass(Class cls, Class newSuper);//设置父类
18. 3.5 其他还有类似于 void *objc_destructInstance(id obj);//摧毁实例对象等
等
四.Class的重要函数
1. 4.1 get*(获取)
2. 4.1.1 object_getClass(id obj); 3. 4.1.2 IMP object_getMethodImplementation(id obj, SEL name);//获得
实例方法实现
4. 4.1.3 Ivar object_getInstanceVariable(id obj, const char *name, void
**value)//获取实例属性
5. 4.2 set*(设置)
6. 4.2.1 Class object_setClass(id obj, Class cls);
7. 4.2.2 Ivar object_setInstanceVariable(id obj, const char *name, void
*value);//设置实例属性
8. 4.2.3 void object_setIvar(id obj, Ivar ivar, id value);//设置实例变量
9. 4.3 其他
10. 4.3.1 static void _class_resolveClassMethod(Class cls, SEL sel, id
inst);//动态添加类方法,不必在乎方法是否存在
11. 4.3.2 static void _class_resolveInstanceMethod(Class cls, SEL sel, id
inst);//动态添加实现方法,不必在乎方法是否存在
12. 4.3.3 unsigned _class_createInstancesFromZone(Class cls, size_t
extraBytes, void *zone,id *results, unsigned num_requested);//创建实例存储空间
13. 4.4 消息转发
14. 4.4.1 void instrumentObjcMessageSends(BOOL flag);//flag传入YES,
运行时发送的所有消息都会打印到/tmp/msgSend-xxxx文件里了。
更多IOS开发objective-c视频教程,点此查看>>/lesson/2040/。
正在阅读:
IOS开发教程Class详解05-12
模范机关建设推进会交流材料09-08
区机关事务管理服务中心关于过去五年工作总结和未来五年工作部署的报告07-30
2014~2015学年度潮阳区第一学期期末统考高二理综化学试卷及答案202-26
2015-2020年中国液态奶市场深度研究与投资前景调研报告03-24
广东省广州市第二中学2017届九年级下学期第一次模拟考试化学试题(含答案)10-30
抢劫罪刑事指导案例裁判规则大汇总09-14
11,彩虹教案06-21
开展矛盾纠纷排查化解专项活动的方案的通知10-22
民主生活会制度的历史由来与演进02-25
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 详解
- 教程
- 开发
- Class
- IOS
- 工商管理类本科专业课程设置中外比较研究
- 实验四-路由器的认识及静态路由配置
- 无线话筒实验报告
- 商务接待表单201208改
- SMT激光软钎焊自动焊接系统的研究1111
- 幼儿园大班班主任年终总结精选范文
- 魔芋产业种植总结报告
- 日本电影告白台词
- Foobar2000歌词插件安装方法
- 瓷器鉴定的断代与分期方法
- 2011晋江市科目一考试客车仿真试题
- 基于PLC的高压电机软启动装置的设计
- 北京科技大学2010自主招生笔试面试试题(组图)
- 人教统编版2021-2022年六年级上册语文第2单元达标测试卷A卷
- 沉积学-期末考试
- 信息资源管理 第二章
- 33 起重吊运作业安全管理规定20120603
- 外文翻译_Spring的web MVC 构架模式
- 安全生产应急管理(新编简明教程)
- 《武汉市建设工程竣工档案编制及报送规定》的通知(一)