美文网首页
iOS知识-类别Category

iOS知识-类别Category

作者: 男人宫 | 来源:发表于2022-02-11 15:26 被阅读0次
    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 <UIKit/UIKit.h>
    
    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 <objc/runtime.h>
    
    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

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