iOS分类

作者: DeerRun | 来源:发表于2018-12-12 13:48 被阅读2次
    // 1.分类是用于给原有类添加方法的, 它只能添加方法, 不能添加属性(成员变量)
    @interface Person (NJ)
    //{
    //    double _height;
    //}
    
    // 2.分类中的@property, 只会生成setter/getter方法的声明, 不会生成实现以及私有的成员变量
    //@property (nonatomic, assign) double height;
    
    - (void) hello;
    
    /*
     方法的调用顺序:
     1.分类
     2.本类
     3.父类
     */
    @end
    
    // 3、如果多个分类中都有和原有类中同名的方法, 那么调用该方法的时候执行谁由编译器决定
    // 会执行最后一个参与编译的分类中的方法
    
    // 4、注意: 如果分类中有和原有类同名的方法, 会调用分类中的方法
    // 也就是说会忽略原有类的方法
    // 注意: 在开发中尽量不要这样写
    
    在分类中的属性没有成员变量个getter、setter方法。
    实现getter和setter方法;所以我们无法通过getter和setter方法操作color也不能直接访问_color
    实现getter和setter方法,并且找到一个地址空间供我们访问
    @interface Dog (ext)
    
    @property (nonatomic, strong)UIColor  *color;
    
    @end
    
    
    @implementation Dog (ext)
    //这里用@selector(color)来用作 const void *key 的指针
    - (UIColor *)color {
        return objc_getAssociatedObject(self, _cmd);
    }
    
    - (void)setColor:(UIColor *)color {
        objc_setAssociatedObject(self, @selector(color), color, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    @end
    
    属性 = 成员变量+getter、setter
    在分类里使用@property声明属性后,又实现了setter和getter方法,那么在这个类以外可以正常通过点语法给该属性赋值和取值。就是说,在分类里使用@property声明属性,又实现了setter和getter方法后,可以认为给这个类添加上了属性
    

    相关文章

      网友评论

          本文标题:iOS分类

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