IOS开发教程Class详解_第1页
IOS开发教程Class详解_第2页
IOS开发教程Class详解_第3页
IOS开发教程Class详解_第4页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、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_,原先的类,编译器发出警告*

2、/1.#if !defined(OBJC_ISA_AVAILABILITY)2.# if _OBJC2_3.# define OBJC_ISA_AVAILABILITY _attribute_(deprecated)4.# else5.# define OBJC_ISA_AVAILABILITY /* still available */6.# endif7.#endif1.typedef struct objc_method *Method;2.typedef struct objc_ivar *Ivar;3.typedef struct objc_category *Category;4.

3、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.4.#if !_OBJC2_5. Class super_class OBJC2_UNAVAILABLE;/父类6. const char *name OBJC2_UNAVAILABLE;/类名7. long version OBJC2_UNAVAILABLE;/类版本8. long info OBJ

4、C2_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的信息确定是类还是实例,运

5、行什么函数方法等12. struct objc_cache *cache OBJC2_UNAVAILABLE;/缓存13. struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;/协议14.#endif15.16. OBJC2_UNAVAILABLE;二:class初始化Runtime的行为之一就是initialize。在程序运行过程中,它会在你程序中每个类调用一次initialize。这个调用的时间发生在你的类接收到消息之前,但是在它的超类接收到initialize之后。1./在苹果的官方Runtime中有个objc-initializ

6、e.m文件,进行解读2.typedef struct _objc_initializing_classes 3. int classesAllocated;/类是否分配存在4. Class *metaclasses;/类的父类,如果没有父类那就是自身5. _objc_initializing_classes;/初始化一个对象_objc_initializing_classes6.7./将所有的类存储在静态链表中,以待接下来的接收和发送消息8.static _objc_initializing_classes *_fetchInitializingClassList(BOOL create)9.

7、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 = (

8、_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 c

9、reate = NO.34. / Allow 4 simultaneous class inits on this thread before realloc.35. list-classesAllocated = 4;36. classes = (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 IM

10、P 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, constchar *types);/增加类方法4. 3.1.3 BOOL class_addIvar(Class cls, const char *name, size_tsize,uint8_t alignment, const char *type);/增加实例变量5. 3.1.4 static BOOL _cla

11、ss_addProperty(Class cls, const char*name,const objc_property_attribute_t *attrs, unsigned int count,BOOLreplace);/增加属性6. 3.2 replace*(修改)7. 3.2.1 IMP class_replaceMethod(Class cls, SEL name, IMP imp, constchar *types); /修改方法8. 3.2.2 void class_replaceProperty(Class cls, const char *name,constobjc_p

12、roperty_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_g

13、etMethod(Class cls, SEL sel);/获取类方法14. 3.3.5 static Protocol *getProtocol(const char *name);/增加协议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);/摧毁实例对象等等

14、四.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 objec

15、t_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, idinst);/动态添加类方法,不必在乎方法是否存在11. 4.3.2 static void _class_resolveInstanceMethod(Class cls, SEL sel, idinst);/动态添加实现方法,不必在乎方法是否存在12. 4.3.3 unsigned _class_createInstancesFromZone(Class cls, size_textraBytes, void *zone,id *results,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论