美文网首页
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