深入理解Objective-C:Category.docxVIP

  • 2
  • 0
  • 约7.76千字
  • 约 19页
  • 2018-06-02 发布于江西
  • 举报
深入理解Objective-C:Category.docx

1、Category介绍类别。?使用方法自行搜索。使用场景:1、给已经存在的类添加方法。2、把类的实现放在不同的文件里面。好处如下:?(1)可以减少单个文件的体积。?(2)可以把不同的功能组合到不同的category里?(3)可以按需要加载想要的category3、声明私有方法4、模拟多继承5、把framework的私有方法公开2、Category和ExtensionExtension扩展,更像是一个匿名的category。但是二者几乎完全是两个东西。ExtensionExtension是在编译器决议,它就是类的一部分,在编译器和头文件里的@interface以及实现文件里的@implement一起形成一个完整的类,它伴随类的产生而产生,亦随着一起消忘。Extension一般用来隐藏类的私有信息。你必须有一个类的源码才能为一个类添加extension,所以无法为系统的类添加extension。CategoryCategory是运行期决议的。?在运行期,对象的内存布局已经确定,所以是无法添加实例变量的。如果添加实例变量会破坏类的内部布局,这对编译型语言来说是灾难性的。3、Category真面目我们知道,所有的OC类和对象,在runtime层都是用struct表示的,category也不例外,在runtime层,category用结构体category_t(在objc-runtime-new.h中可以找到此定义)。?它包含了?1)、类的名字(name)?2)、类(cls)?3)、category中所有给类添加的实例方法的列表(instanceMethods)?4)、category中所有添加的类方法的列表(classMethods)?5)、category实现的所有协议的列表(protocols)?6)、category中添加的所有属性(instanceProperties)从category的定义也可以看出category的可为(可以添加实例方法,类方法,甚至可以实现协议,添加属性)和不可为(无法添加实例变量)。?ok,我们先去写一个category看一下category到底为何物:@interfaceMyClass : NSObject- (void)printName;@end@interfaceMyClass(MyAddition)@property(nonatomic, copy) NSString *name;- (void)printName;@end1234567891011121314@implementationMyClass- (void)printName{NSLog(@%@,@MyClass);}@end@implementationMyClass(MyAddition)- (void)printName{NSLog(@%@,@MyAddition);}@end1234567891011121314151617(在这篇文章中,会出现警告:”Category is implementing a method which will also be implemented by its primary class”. 有洁癖的小伙伴请左拐?传送门)我们使用clang的命令去看看category到底会变成什么:clang -rewrite-objcMyClass.m?【clang操作传送门】好吧,我们得到了一个3M大小,10w多行的.cpp文件(这绝对是Apple值得吐槽的一点),我们忽略掉所有和我们无关的东西,在文件的最后,我们找到了如下代码片段:staticstruct/*_method_list_t*/ {unsignedintentsize; // sizeof(struct _objc_method)unsignedintmethod_count;struct _objc_methodmethod_list[3];} _OBJC_$_CATEGORY_INSTANCE_METHODS_MyClass_$_MyAddition __attribute__ ((used, section (__DATA,__objc_const))) = {sizeof(_objc_method),3, {{(structobjc_selector *)setName:, v24@0:8@16, (void *)_I_MyClass_MyAddition_setName_}, {(structobjc_selector *)name, @16@0:8, (void *)_I_MyClass_MyAddition_name}, {(structobjc_selector *)printName, v16@

文档评论(0)

1亿VIP精品文档

相关文档