分类:在不改变原有类的基础上,为原有类添加方法。不可定义属性,只能定义getter和setter方法。
作用:一般用来为系统的类扩展方法或者把某个复杂的类的按照功能拆到不同的文件里。
objectivec
NSString+PhoneNumber.h
#import <Foundation/Foundation.h>
@interface NSString (phoneNumber)
- (NSString *)phoneNumber;
@end
NSString+PhoneNumber.m
@implemention NSString (phoneNumber)
- (NSString *)phoneNumber
{
if (self.length == 11 && [self hasPrefix:@"1"]) {
return [@"+86" stringByAppendingString:self];
}
return self;
}
@end
扩展:也叫做匿名分类,为原有类添加私有变量和方法。
作用:一般用扩展来声明私有属性,或者把.h的只读属性重写成可读写的。
objectivec
UITestManager.h
@interface UITestManager: NSObject
@property(nonatomic, assign) BOOL isIUest;
@end
UITestManager.m
@interface UITestManager()
@property(nonatomic, assign) BOOL testKey;
@end
@implementation UITestManager
- (void)setup() {
}
@end
分类和扩展的区别
1.分类是在运行时把分类信息合并到类信息中,而扩展是在编译时,就把信息合并到类中。
2.分类声明的属性,只有生成getter/setter的声明,不会自动生成成员变量和getter/setter的实现,而扩展会。
3.分类不可以为类添加实例变量而扩展可以。
4.分类可以为类添加方法的实现而扩展只能声明方法,不能实现。
分类的局限性:
1.无法为类添加添加实例变量,但可以通过关联对象实现。
2.分类的方法若和类中原本的实现重名,会覆盖原本方法的实现。(非真正意义上的覆盖)
3.多个分类的方法重名,会调用最后编译的那个分类的实现。