类别(Category) 和类扩展(Extension)

总结

项目 类别(Category) 类扩展(Extension)
别名 分类 匿名分类
位置 单独的.h .m文件中 .m文件中@implementation的上面
命名 @interface 类名 (分类名) @interface 类名 ()
@property 不能生成set、get方法 可以生成set、get方法
使用环境 对框架的扩展(没有源码,只能使用类别扩展);或者对类的方法归类 自定义类中创建私有变量和方法

此表格只是列举一般情况

类别

main.m

#import 
#import "Category.h"


int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSString *str = @"test";
        
        [str function1];
        [str method1];
    }
    return 0;
}

Category.h

#import 

//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 
#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 

@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

你可能感兴趣的:(类别(Category) 和类扩展(Extension))