Extension
在语法上和Category
非常相似,可实际上却又不一样。在语法上,Extension
更像是一个没有名字的Category
。在class
名称后面直接加上一个空的括号()
就是Extension
,而在Extension
中定义的方法需要在原来的class
的impletement
中实现。形如下:
@interface MyClass: NSObject
@end
@interface MyClass()
- (void)test
@end
@impletementation MyClass
- (void) test {}
@end
Extentsion 的作用
- 为
header
(.h 文件)进行分组
如果在一个class
声明了太多的的method
,可以使用Extension
对这些method
进行分组归类,将这些method
放到Extension
中去。Extension
除了可以对method
进行分组,也能对成员变量进行分组。 - 管理 Private Methods
在早期的Xcode
中,若没有声明method
而是直接实现这些method
,当调用这些method
时,会出现警告,而这些警告往往是很重要的。把这些method
移到其他方法之前,可以消除警告。但是不能保证完全消除,因为这些method
之间也有可能相互调用。那就需要进一步知道这些method
调用顺序,这样做实在是太麻烦了,并不可取。苹果给的建议是在.m
的开头写一个Extension
,然后将这些method
放在这个Extension
中,这样就能避免那些警告。
在Swift
中,同样也有一个Extension
,可以直接使用用来对class
进行扩展。这个Extension
并不是Objective-C
中的Extension
,更像是其中的Category
。这三者的差别是,Objective-C
中的Category
需要给定名字,Objective-C
中的Extension
是没有名字的Category
,Swift
中的Extension
也同样没有名字。Swift
中的Extension
还能对protocol
和struct
进行扩展。
Category 和 Extension 到底有什么区别
如果两者有什么明显的不同点话应该就是,Extension
可以添加成员变量而Category
不可以。但是Category
可以通过一种方法来实现添加成员变量的效果。苹果提出一套叫做Assocaited Object
的方案,可以在Category
中添加getter/setter
方法。这个方法的大致思想是在runtime
,创建了一张表,这张表格能够记录哪个对象关联了哪个类。