类别和扩展
类别
使用类别可以扩展类的功能,不管该类的源码是否存在都可以扩展,和继承的最大不同就是类别中的方法可以访问被扩展类的私有元素。
- 类别的命名通常使用"类+类别名"的形式,如 Person+PersonLife.h
- 类可以有多个类别。
- 类别会覆盖方法,如果类的方法和类别的方法冲突,则会调用类别的方法
- 类别可以访问私有元素,继承并不可以。
- 类别不能定义属性
类别的定义如下
#import "Person.h"@interface Person(PersonLife)@end@implementation Person(PersonLife)@end
使用类别
使用的时候导入 #import "Person+PersonLife"
#import "Person+PersonLife.h"int main(int argc, const char * argv[]){@autoreleasepool {Person *p = [[Person alloc] init];}return 0;}
类扩展
类扩展是一种特殊的类别,在声明的时候Person() ,括号里不要写名字。
- 扩展可以定义属性。
- 扩展必须和类定义和类实现同时编译,它不能对无源码的类扩展
- 通常使用扩展来声明私有方法
Person 类
#import <Foundation/Foundation.h>// Person 类@interface Person : NSObject// Person 类公开的方法-(void) print ;@end
Person 类扩展,扩展中声明私有元素
// 引入原类#import "Person.h"// 扩展,扩展中定义私有元素@interface Person ()// 私有属性@property NSString *name ;// 私有方法-(void) privateMethod ;@end
Person 类的实现文件
#import "PersonPrivate.h"@implementation Person// 生成私有getter、setter 方法@synthesize name ;// 实现公开方法-(void) print{[self privateMethod];}// 实现私有方法-(void) privateMethod{NSLog(@"private Method Execute ~~") ;}@end
使用Person 类
// 引入Person 类#import "Person.h"int main(int argc, const char * argv[]){@autoreleasepool {Person *p = [[Person alloc] init];// 调用类公开的方法[p print] ;// p.name ; 报错// [p privateMethod] ; 报错,name的getter、setter方法和privateMethod都是私有元素,外部无法调用}return 0;}

浙公网安备 33010602011771号