定义方式
- 类别(Category):在
.h
文件中声明,使用 @interface 类名 (类别名)
形式,在 .m
文件中实现。例如:
// 声明
@interface NSString (MyCategory)
- (NSString *)customMethod;
@end
// 实现
@implementation NSString (MyCategory)
- (NSString *)customMethod {
return @"Custom String";
}
@end
- 扩展(Extension):通常声明在类的
.m
文件中,形式为 @interface 类名 ()
,一般没有实现部分,因为扩展添加的方法由类本身实现。例如:
// 在类的.m文件中声明扩展
@interface MyClass ()
@property (nonatomic, strong) NSString *privateProperty;
- (void)privateMethod;
@end
作用范围
- 类别(Category):可在不改变类原有代码的情况下,为现有的类添加新方法,甚至可以为系统类添加方法,作用范围较广。不同的类别可以在不同的源文件中定义,只要在使用类别方法前引入对应的头文件即可。
- 扩展(Extension):主要用于为类添加私有的属性和方法,作用范围主要在类的实现文件(
.m
)内,对类的使用者隐藏这些新增的内容。
可添加内容
- 类别(Category):主要用于添加方法,不能添加实例变量。如果需要添加类似实例变量的功能,可以使用关联对象(Associated Objects)。
- 扩展(Extension):既可以添加属性(编译器会自动合成属性的存取方法),也可以添加方法。扩展添加的属性和方法默认是私有的,只能在类的实现文件中访问。