iOS知识-类别Category

Category:类别(或者分类),是oc中的特有语法,它是表示一个指向分类结构体的指针.原则上只能增加方法,不能增加成员变量
Category
Category 是表示一个指向分类的结构体的指针,其定义如下:
typedef struct objc_category *Category;
struct objc_category {
  char *category_name                          OBJC2_UNAVAILABLE; // 分类名
  char *class_name                             OBJC2_UNAVAILABLE; // 分类所属的类名
  struct objc_method_list *instance_methods    OBJC2_UNAVAILABLE; // 实例方法列表
  struct objc_method_list *class_methods       OBJC2_UNAVAILABLE; // 类方法列表
  struct objc_protocol_list *protocols         OBJC2_UNAVAILABLE; // 分类所实现的协议列表
//其中可以看出没有属性列表,所以原则上不能增加属性,但由于OC语言的运行特性,可以利用runtime进行属性的增加
如给一个UIImageView类扩张方法和增加属性

.h文件如下

#import 

NS_ASSUME_NONNULL_BEGIN

@interface UIImageView (Image)
@property(nonatomic, copy)NSString *imageUrl;
- (void)changeBgColor;
@end

NS_ASSUME_NONNULL_END

.m文件如下

import "UIView+Image.h"
#import 

static NSString *namekey = @"namekey"; //定义一个key值
@implementation UIImageView (Image)


- (void)setImageUrl:(NSString *)imageUrl
{
    objc_setAssociatedObject(self, &namekey, imageUrl, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)imageUrl
{
    return objc_getAssociatedObject(self, &namekey);
}
- (void)changeBgColor
{
    self.backgroundColor = [UIColor purpleColor];
    
}
@end

使用

 UIImageView *view = [UIImageView new];
    view.bounds = CGRectMake(0, 0, 100, 100);
    view.center = self.view.center;
    [self.view addSubview:view];
    [view changeBgColor];
    view.imageUrl = @"https://dsfdfssdf.png";
    NSLog(@"%@",view.imageUrl);
///输出结果https://dsfdfssdf.png.说明属性增加成功

你可能感兴趣的:(iOS知识-类别Category)