从runtime角度理解属性和成员变量的区别

属性和成员变量的区别有很多的帖子都讲了,有兴趣大家可以去看一看。我就简略的说一下,属性就是在编译器的帮助下自动生成_属性名的成员变量和setter、getter方法,成员变量需要自己去书写,具体写法大家可以百度。这里我主要是从runtime的角度,查看在类中,它们到底有什么区别。直接上代码

1.创建一个Person类

@interface Person : NSObject
{
    NSString *sex;
}

@property (copy, nonatomic) NSString *name;
@property (assign, nonatomic) int age;
@end

2.分别获取变量列表、属性列表、方法列表,对比它们的区别
2.1 先查看变量列表

- (void)test_IvarList {
    
    unsigned int count;
    
    Ivar *varA = class_copyIvarList([Person class], &count);
    
    for (unsigned int i=0; i<count; i++) {
        
        Ivar v = varA[i];
        const char *name = ivar_getName(v);
        const char *cls = ivar_getTypeEncoding(v);
        
        NSLog(@"----%s----",name);
        NSLog(@"----%s----",cls);
        
    }
}
Snip20181106_8.png

2.2查看属性列表

- (void)test_PropertyList {
    
    unsigned int count;
    
    objc_property_t *propertyArray = class_copyPropertyList([Person class], &count);

    
    for (unsigned int i=0; i<count; i++) {
        
        objc_property_t property = propertyArray[i];
        const char *name = property_getName(property);
        const char *cls = property_getAttributes(property);
        
        NSLog(@"----%s----",name);
        NSLog(@"----%s----",cls);
        
    }
}
Snip20181106_9.png

2.3 查看方法列表

- (void)test_MethodList {

    unsigned int count;

    Method *methods = class_copyMethodList([Person class], &count);
    
    for (int i = 0; i < count; i++) {
        
        Method method = methods[i];
        SEL selector = method_getName(method);
        NSString *name = NSStringFromSelector(selector);
        
        NSLog(@"method_getName:%@",name);
    }

}
Snip20181106_10.png

这样对比一下就很清楚了,属性是有setter和getter的,并且属性存储在PropertyList 中。成员变量是不会生成setter和getter的,它只存储在成员变量中。编译器会为属性生成一个_属性名的成员变量。以上

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,645评论 8 265
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,145评论 1 32
  • 《金光神咒》常诵神咒,可辟邪护身,解万千灾劫! ☯ 咨询、交流,请加道长私人微信号:15386233888~158...
    宇宙大道和同天下阅读 16,746评论 2 7
  • 春寒料峭三月天娇香玉兰花欲开闲来无事把门关燃香一柱满厅香
    妖精豆子阅读 169评论 0 2
  • 农村教育需要人 近日有教育工作者撰文称,自己跟一位农村校校长交流,谈到教学质量不高的问题,他谈了很多原因,但大都归...
    乡村追梦人阅读 126评论 0 4