美文网首页
oc的分类属性

oc的分类属性

作者: itclimb | 来源:发表于2017-07-04 16:24 被阅读81次
    oc.jpg
    我的博客
    oc中在分类添加属性需要实现它的get和set方法,不然就会挂掉,查了一些资料,表达一下自己的理解.
    首先,创建一个Person类:

    Person.h

    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    
    @property(nonatomic, copy) NSString *name;
    
    @property(nonatomic, assign) NSInteger age;
    
    @end
    

    Person.m

    #import "Person.h"
    
    @implementation Person
    
    - (void)test{
        NSLog(@"%s",__func__);
    }
    
    @end
    

    在控制器中获取并打印这个类的属性,成员变量以及方法,我们可以看到,对于类中的属性,会程序会自动生成带"_"的成员变量和它的get,set方法,
    类中的属性相当于成员变量以及set,get方法.

    2017-07-04 15:50:39.581 分类属性分析[29919:4124560] 第0个属性:name
    2017-07-04 15:50:39.582 分类属性分析[29919:4124560] 第1个属性:age
    2017-07-04 15:50:39.582 分类属性分析[29919:4124560] 第0个成员变量:_name
    2017-07-04 15:50:39.582 分类属性分析[29919:4124560] 第1个成员变量:_age
    2017-07-04 15:50:39.583 分类属性分析[29919:4124560] 第0个方法:age
    2017-07-04 15:50:39.583 分类属性分析[29919:4124560] 第1个方法:setAge:
    2017-07-04 15:50:39.583 分类属性分析[29919:4124560] 第2个方法:test
    2017-07-04 15:50:39.583 分类属性分析[29919:4124560] 第3个方法:.cxx_destruct
    2017-07-04 15:50:39.583 分类属性分析[29919:4124560] 第4个方法:name
    2017-07-04 15:50:39.584 分类属性分析[29919:4124560] 第5个方法:setName:
    

    给Person类添加一个分类:

    Person+Weight.h

    #import "Person.h"
    
    @interface Person (Weight)
    
    @property(nonatomic, copy) NSString *weight;
    
    @end
    

    Person+Weight.m, 在.m中会有个警告,weight这个属性没有set,get方法.

    #import "Person+Weight.h"
    
    @implementation Person (Weight)
    
    
    @end
    

    再次在控制器中获取并打印这个类的属性,成员变量以及方法,在分类中添加的属性并没有生成带"_"的成员变量以及set,get方法.

    2017-07-04 16:03:44.757 分类属性分析[30014:4213844] 第0个属性:weight
    2017-07-04 16:03:44.757 分类属性分析[30014:4213844] 第1个属性:name
    2017-07-04 16:03:44.758 分类属性分析[30014:4213844] 第2个属性:age
    2017-07-04 16:03:44.758 分类属性分析[30014:4213844] 第0个成员变量:_name
    2017-07-04 16:03:44.758 分类属性分析[30014:4213844] 第1个成员变量:_age
    2017-07-04 16:03:44.758 分类属性分析[30014:4213844] 第0个方法:age
    2017-07-04 16:03:44.758 分类属性分析[30014:4213844] 第1个方法:setAge:
    2017-07-04 16:03:44.758 分类属性分析[30014:4213844] 第2个方法:test
    2017-07-04 16:03:44.759 分类属性分析[30014:4213844] 第3个方法:.cxx_destruct
    2017-07-04 16:03:44.759 分类属性分析[30014:4213844] 第4个方法:name
    2017-07-04 16:03:44.759 分类属性分析[30014:4213844] 第5个方法:setName:
    

    在Person+Weight.m中实现set,get方法,但是并不能用带"_"的成员变量直接进行赋值,从上面的打印可以看出没有成员变量,此时就需要根据oc语言的运行时机制,在程序运行时给分类的属性动态关联对象.

    #import "Person+Weight.h"
    #import <objc/runtime.h>
    
    @implementation Person (Weight)
    
    - (NSString *)weight{
        return objc_getAssociatedObject(self, @"weight");
    }
    
    - (void)setWeight:(NSString *)weight{
        objc_setAssociatedObject(self, @"weight", weight, OBJC_ASSOCIATION_COPY_NONATOMIC);
    }
    
    @end
    

    总结:在分类里使用@property声明属性,只是将该属性添加到该类的属性列表,并声明了setter和getter方法,但是没有生成相应的成员变量,也没有实现setter和getter方法。需要实现它的get和set方法,这样在类的外部就能用点语法获取并设置属性,这样可以认为给类添加了属性.
    由于这是在查资料后自己的理解,因此可能会存在一定的错误,希望发现错误并指出,不断进行完善.

    相关文章

      网友评论

          本文标题:oc的分类属性

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