美文网首页iOS开发
谈谈Objective-C中分类和类扩展

谈谈Objective-C中分类和类扩展

作者: kamto | 来源:发表于2017-08-01 15:05 被阅读41次

    1.分类Category

    • 给原有类添加方法,类别中的方法没被实现也不会有任何警告,因为类别是在运行时添加到类中。
      原则不能添加属性或者成员变量,实际上可以通过runtime方式添加属性或者成员变量
    • 分类中可以写@property, 但不会生成setter/getter方法, 也不会生成实现以及私有的成员变量(编译时会报警告)。
      可以通过runtime手动添加setter/getter方法
    • 分类中可以访问原有类.h中的属性
    • 如果分类中有和原有类同名的方法,优先级是分类>原有类>原有类的父类

    建立两个文件:Person+category.h和Person+category.m

    #import "Person.h"
    @interface Person (category)
    @property (nonatomic, strong) NSString *name;
    (void)categoryMethod;
    @end
    
    #import <objc/runtime.h>
    @implementation Person (category)
    (void)categoryMethod{
        //code}
    
    //通过runtime手动添加setter/getter方法
    
    - (void)setName:(NSString *)name{
         objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    - (NSString *)name{
        return objc_getAssociatedObject(self, @selector(name));
    }
    

    注意:在原有类里使用下划线_访问分类中的属性是访问不到的,只能使用self访问

    2.类扩展Extension

    类扩展Extension与分类相比少了实现文件,我们称之为匿名分类

    • 为原有类添加新的属性(成员变量)和方法
    • 类扩展的私有方法必须实现,否则会发生警告,因为类扩展是在编译阶段被添加到类中
    • 类扩展的私有方法在原有类的.m中实现
    • 定义在 .m 文件中的类扩展方法为私有的,定义在 .h 文件中的类扩展方法为公有的

    建立一个文件:Person_extension

    #import "Person.h"
    
    @interface Person ()
    //私有属性
    @property (nonatomic, strong) NSString *cardId;
    //私有方法
    - (void)extensionMethod;
    
    @end
    
    
    在Person.m中
    
    实现类扩展的方法
    -(void)extensionMethod{
        //code
    }
    

    也可以这样创建一个Extension,在.m文件中

    @interface Person ()
    - (void)extensionMethod2;
    @end
    

    这也是一个类扩展

    温故而知新,常常写下笔记也会有意想不到的作用。

    相关文章

      网友评论

        本文标题:谈谈Objective-C中分类和类扩展

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