美文网首页
category的作用

category的作用

作者: alige | 来源:发表于2017-02-25 17:04 被阅读59次

    1,比如一个类功能太庞大,可以使用category进行分散

    2,创建私有方法的前向引用

    -例如Person类有一个私有方法
    -(void)processStr:(NSString*)str;
    在viewDidLoad方法中想要使用Person的这个方法

    Person* p = [[Person alloc] init];
    [p precoessStr:@"str"];
    

    这样编译不能通过,如果给Person添加了一个分类,并且在分类中声明这个方法,再在viewDidLoad方法的文件中包含这个分类,那么就不会报错,可以正常运行了。

    3,添加非正式协议

    正式协议需要用@protocol,@required,
    @optional,@delegate来规范书写方式,而非正式协议则不需要,只要相应的delegate类直接实现就可以。但是category仅限于NSObject类的分类,不能用它的子类实现非正式协议
    如:NSObject+Test分类

    -(NSString)inputStr:(NSString)str;这个方法要么在NSObject+Test.m文件中实现,要么在Person.m文件中实现
    //NSObject+Test.h
    #import <Foundation/Foundation.h>
    @interface NSObject (Test)
    
    -(NSString*)inputStr:(NSString*)str;
    @end
    
    
    //NSObject+Test.m文件
     #import "NSObject+test.h"
    @implementation NSObject (test)
    
    @end
    

    Person类

    //Person.h文件
    #import <Foundation/Foundation.h>
    #import "NSObject+Test.h"
    @interface Person : NSString
    
    @end
    
    //Person.m文件
    #import "Person.h"
    @implementation Person
    
    -(NSString*)inputStr:(NSString*)str
    {
        if ([str isEqualToString:@"wdc"]) {
            return @"ldy";
        }
        return @"error";
    }
    @end
    

    在viewcontroller中

    
    - (void)viewDidLoad {
        [super viewDidLoad];
        Person* p = [[Person alloc] init];
        NSString* str = [p inputyouName:@"wdc"];
        NSLog(@"%@",str);
    }
    

    输出:ldy

    category和extension的区别
    -0,extension是在运行时决议的,extension在编译时就决议了。
    -1,extension是类的一部分,它与头文件的和实现文件一起构成一个完整的类,它一般用来隐藏类的私有信息,而category则不是与原来的类是一个整体,它可以直接添加category,因此它无法向category一样添加extension。
    -2,extension可以给类直接添加实例变量,category不可以给一个类添加实例变量(因为在运行期,对象的内存布局已经确定,如果添加实例变量就会破坏类的内部布局,这对编译型语言来说是灾难性的),要通过runtime关联对象来实现。
    引用:
    美图:http://tech.meituan.com/DiveIntoCategory.html

    相关文章

      网友评论

          本文标题:category的作用

          本文链接:https://www.haomeiwen.com/subject/clhnwttx.html