其他分享
首页 > 其他分享> > Category与Extension

Category与Extension

作者:互联网

1. Category

1.1 定义与特点

1.2 关于添加变量

1.3 用runtime为属性添加存取方法

  1. 可以使用runtime提供的关联对象方法,动态的为property实现gettersetter,以实现setter为例
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);
  1. 扩展NSString类的方法为例,扩展属性、实例方法和类方法,使用runtime实现属性的gettersetter,代码如下:
//  NSString+Category.h

#import <Foundation/Foundation.h>

@interface NSString (Category) {
    /*不可添加成员变量*/
}
@property(nonatomic,copy) NSString *newString;
//扩展的实例方法和类方法
+(void)categoryClassMethod;
-(void)categoryInstanceMethod;
@end
//  NSString+Category.m

#import "NSString+Category.h"
#import <objc/runtime.h>

@implementation NSString (Category)

//runtime强行实现newString的getter和setter
-(NSString *)newString {
    return objc_getAssociatedObject(self, @"newString");
}

-(void)setNewString:(NSString *)newString {
    objc_setAssociatedObject(self, @"newString", newString, OBJC_ASSOCIATION_COPY);
}

//扩展的实例方法和类方法
+(void)categoryClassMethod {
    NSLog(@"这是扩展的类方法");
}
-(void)categoryInstanceMethod {
    NSLog(@"这是扩展的实例方法");
}
@end
//  main.m

#import <Foundation/Foundation.h>
#import "NSString+Category.h"

int main(int argc, const char * argv[]) {
    NSString *string = [[NSString alloc] init];
    
    //runtime实现的getter和setter
    string.newString = @"你好";
    NSLog(@"%@",string.newString);
    
    //扩展的类方法和实例方法
    [NSString categoryClassMethod];
    [string categoryInstanceMethod];
    
    return 0;
}

在这里插入图片描述

2. Extension

2.1 位置

2.2 为啥要用

2.2 关于添加变量

/*类扩展区域*/
@interface extensionClass()

/* 类扩展属性,类外部不可访问*/
@property(nonatomic, copy) NSString* extensionVariable;

/* 类扩展方法声明,可省略,若声明了就得在后面实现 */
-(void)extensionInstanceMethod;
+(void)extensionClassMethod;

标签:Category,Extension,方法,void,扩展,NSString,newString
来源: https://blog.csdn.net/qq_35087425/article/details/113768623