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

2018-11-06  本文已影响0人  编程_书恨少

属性和成员变量的区别有很多的帖子都讲了,有兴趣大家可以去看一看。我就简略的说一下,属性就是在编译器的帮助下自动生成_属性名的成员变量和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的,它只存储在成员变量中。编译器会为属性生成一个_属性名的成员变量。以上

上一篇下一篇

猜你喜欢

热点阅读