总结
项目 | 类别(Category) | 类扩展(Extension) |
---|---|---|
别名 | 分类 | 匿名分类 |
位置 | 单独的.h .m文件中 | .m文件中@implementation的上面 |
命名 | @interface 类名 (分类名) | @interface 类名 () |
@property | 不能生成set、get方法 | 可以生成set、get方法 |
使用环境 | 对框架的扩展(没有源码,只能使用类别扩展);或者对类的方法归类 | 自定义类中创建私有变量和方法 |
此表格只是列举一般情况
类别
main.m
#import <Foundation/Foundation.h>
#import "Category.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString *str = @"test";
[str function1];
[str method1];
}
return 0;
}
Category.h
#import <Foundation/Foundation.h>
//Function分类
@interface NSString (Function)
- (void)function1;
- (void)function2;
- (void)function3;
@end
//Method分类
@interface NSString (Method)
- (void)method1;
- (void)method2;
- (void)method3;
@end
Category.m
#import "Category.h"
//Function分类
@implementation NSString (Function)
- (void)function1 {
NSLog(@"fun1");
}
- (void)function2 {
NSLog(@"fun2");
}
- (void)function3 {
NSLog(@"fun3");
}
@end
//Method分类
@implementation NSString (Method)
- (void)method1 {
NSLog(@"met1");
}
- (void)method2 {
NSLog(@"met2");
}
- (void)method3 {
NSLog(@"met2");
}
@end
运行结果
2016-09-28 21:56:53.139 Category[4043:370869] fun1
2016-09-28 21:56:53.140 Category[4043:370869] met1
类扩展
main.m
#import <Foundation/Foundation.h>
#import "Extension.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Extension *ext = [[Extension alloc] init];
/**
* 正常,输出"test1"
*/
[ext test1];
/**
* 正常,输出"test1"
*/
NSLog(@"%@", ext.name1);
/**
* 报错,test2是私有方法。
*/
// [ext test2];
/**
* 报错,name2是私有属性
*/
// NSLog(@"%@", ext.name2);
}
return 0;
}
Extension.h
#import <Foundation/Foundation.h>
@interface Extension : NSObject
@property (nonatomic,copy) NSString *name1;
- (void) test1;
@end
Extension.m
#import "Extension.h"
@interface Extension ()
@property (nonatomic,copy) NSString *name2;
- (void)test2;
@end
@implementation Extension
- (void)test1 {
self.name1 = @"test1";
NSLog(@"%@", self.name1);
}
- (void)test2 {
self.name2 = @"test2";
NSLog(@"%@", self.name2);
}
@end